2010-08-12 24 views
9

Tengo un calendario completo con elementos externos que se arrastran sobre él. Soy relativamente nuevo en jquery. No sé exactamente cómo hacer para que la ID del objeto que se arrastra sea un icono de "papelera". Simplemente quiero arrastrar elementos fuera del calendario a una imagen y cuando suelte el mouse, el elemento se elimina.Eliminar elementos de fullcalendar (arrastrando a la papelera)

Este es mi código .....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
<link rel='stylesheet' type='text/css' href='../fullcalendar.css' /> 
<script type='text/javascript' src='../jquery/jquery.js'></script> 
<script type='text/javascript' src='../jquery/jquery-ui-custom.js'></script> 
<script type='text/javascript' src='../fullcalendar.min.js'></script> 
<script type='text/javascript'> 

    $(document).ready(function() { 


     /* initialize the external events 
     -----------------------------------------------------------------*/ 

     $('#external-events div.external-event').each(function() { 

      // create an Event Object (http://arshaw.com/fullcalendar/docs/event_data/Event_Object/) 
      // it doesn't need to have a start or end 
      var eventObject = { 
       title: $.trim($(this).text()) // use the element's text as the event title 
      }; 

      // store the Event Object in the DOM element so we can get to it later 
      $(this).data('eventObject', eventObject); 



      // make the event draggable using jQuery UI 
      $(this).draggable({ 
       zIndex: 999, 
       revert: true,  // will cause the event to go back to its 
       revertDuration: 0 // original position after the drag 
      }); 

     }); 




     /* initialize the calendar 
     -----------------------------------------------------------------*/ 

     $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      editable: true, 
      droppable: true, // this allows things to be dropped onto the calendar !!! 
      drop: function(date, allDay) { // this function is called when something is dropped 

       // retrieve the dropped element's stored Event Object 
       var originalEventObject = $(this).data('eventObject'); 

       // we need to copy it, so that multiple events don't have a reference to the same object 
       var copiedEventObject = $.extend({}, originalEventObject); 

       // assign it the date that was reported 
       copiedEventObject.start = date; 
       copiedEventObject.allDay = allDay; 



       // render the event on the calendar 
       // the last `true` argument determines if the event "sticks" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/) 
       $('#calendar').fullCalendar('renderEvent', copiedEventObject, true); 

       // is the "remove after drop" checkbox checked? 
       if ($('#drop-remove').is(':checked')) { 
        // if so, remove the element from the "Draggable Events" list 
        $(this).remove(); 

       } 
      } 

     }); 

    }); 

</script> 
<style type='text/css'> 

    body { 
     margin-top: 40px; 
     text-align: center; 
     font-size: 14px; 
     font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif; 
     } 

    #wrap { 
     width: 1100px; 
     margin: 0 auto; 
     } 

    #external-events { 
     float: left; 
     width: 150px; 
     padding: 0 10px; 
     border: 1px solid #ccc; 
     background: #eee; 
     text-align: left; 
     } 

    #external-events h4 { 
     font-size: 16px; 
     margin-top: 0; 
     padding-top: 1em; 
     } 

    .external-event { /* try to mimick the look of a real event */ 
     margin: 10px 0; 
     padding: 2px 4px; 
     background: #3366CC; 
     color: #fff; 
     font-size: .85em; 
     cursor: pointer; 
     } 

    #external-events p { 
     margin: 1.5em 0; 
     font-size: 11px; 
     color: #666; 
     } 

    #external-events p input { 
     margin: 0; 
     vertical-align: middle; 
     } 

    #calendar { 
     float: right; 
     width: 900px; 
     } 

</style> 
</head> 
<body> 
<div id='wrap'> 

<div id='external-events'> 
<h4>Draggable Events</h4> 
<div class='external-event'>even1</div> 
<div class='external-event'>even2</div> 

<p> 
<input type='checkbox' id='drop-remove' /> <label for='drop-remove'>remove after drop</label> 
</p> 
</div> 

<div id='calendar'></div> 

<img src="redmond/images/trash.png" id="trash"> 

<div style='clear:both'></div> 
</div> 
</body> 
</html> 
+0

estoy tratando de lograr lo mismo. He intentado la sugerencia de Agzam, y eso te permite arrastrar elementos fuera del calendario, pero parece que no puedo descubrir la forma correcta de detectar este comportamiento como "anormal" para activar el evento de eliminación. – Dutchie432

Respuesta

2

primero de todo lo que vamos a necesitar para eliminar comunicado desbordamiento de css:

.fc-view 
{ 
    /* prevents dragging outside of widget */ 
    width: 100%; 
    overflow: hidden; 
} 

continuación, puede utilizar eventDragStop

1

aquí es algo que solo espero que ayude. No sé si estás usando php/mysql pero si no solo eliminas la llamada ajax y conservas lo que está en la función de éxito.

 $('#calendar').children('.fc-content').children().append('<div id="calendarTrash" style="float: right; padding-top: 5px; padding-right: 5px; padding-left: 5px;"><span class="ui-icon ui-icon-trash"></span></div>'); 

    //listens for drop event 
    $("#calendarTrash").droppable({ 
     tolerance: 'pointer', 
     drop: function(event, ui) { 
      if (dragged && ui.helper && ui.helper[0] === dragged[0]) { 
       var event = dragged[1]; 
       var answer = confirm("Delete Event?") 
       if (answer) 
       { 
        $.ajax({ 
         url:'/employees/removeevent?id='+event.id, 
         dataType: 'json', 
         async: false, 
         error: function(xhr, ajaxOptions, thrownError) 
         { 
          //console.log(xhr.status); 
          //console.log(thrownError); 
         }, 
         success: function() 
         { 
          calendar.fullCalendar('removeEvents' , event.id ); 
         } 
        }); 
       } 
      } 
     } 
    }); 

     eventDragStart: function(event, jsEvent, ui, view) { 
      dragged = [ ui.helper[0], event ]; 
     }, 
+0

¿Qué es "arrastrado"? – MarcoS

+0

el evento del calendario. –

+0

bien, ha pasado mucho tiempo pero si encontraste el código. Editaré la publicación, pero lo que está haciendo es simplemente almacenar en una matriz los diferentes componentes necesarios. –

19

completo tutorial, cómo añadir "mover a la papelera" función para fullcalendar

enter image description here

HERE IS DEMO

si no desea utilizar lanzables:

de fullcalendar.css borre estas líneas

.fc-view 
{ 
    /* prevents dragging outside of widget */ 
    width: 100%; 
    overflow: hidden; 
} 

hallazgo en fullcalenar.js (línea cca 6086)

function eachEventElement(event, exceptElement, funcName) { 
    var elements = eventElementsByID[event._id], 
     i, len = elements.length; 
    for (i=0; i<len; i++) { 
     if (!exceptElement || elements[i][0] != exceptElement[0]) { 
      elements[i][funcName](); 
     } 
    } 
} 

y cambiar a:

function eachEventElement(event, exceptElement, funcName) { 
    var elements = eventElementsByID[event._id], 
     i; 
    if (elements != null) { 
     var len = elements.length; 
     for (i = 0; i < len; i++) { 
      if (!exceptElement || elements[i][0] != exceptElement[0]) { 
       elements[i][funcName](); 
      } 
     } 
    } 
} 

en JS:

//actually cursor position 
var currentMousePos = { 
    x: -1, 
    y: -1 
}; 

//set actually cursor pos 
jQuery(document).ready(function() { 

    jQuery(document).on("mousemove", function (event) { 
     currentMousePos.x = event.pageX; 
     currentMousePos.y = event.pageY; 
    }); 

}); 

//check if cursor is in trash 
    function isElemOverDiv() { 
     var trashEl = jQuery('#calendarTrash'); 

     var ofs = trashEl.offset(); 

     var x1 = ofs.left; 
     var x2 = ofs.left + trashEl.outerWidth(true); 
     var y1 = ofs.top; 
     var y2 = ofs.top + trashEl.outerHeight(true); 

     if (currentMousePos.x >= x1 && currentMousePos.x <= x2 && 
      currentMousePos.y >= y1 && currentMousePos.y <= y2) { 
      return true; 
     } 
     return false; 
    } 

//fullcalendar mouseover callback 

     eventMouseover: function (event, jsEvent) { 
      $(this).mousemove(function (e) { 
       var trashEl = jQuery('#calendarTrash'); 
       if (isElemOverDiv()) { 
        if (!trashEl.hasClass("to-trash")) { 
         trashEl.addClass("to-trash"); 
        } 
       } else { 
        if (trashEl.hasClass("to-trash")) { 
         trashEl.removeClass("to-trash"); 
        } 

       } 
      }); 
     }, 

//fullcalendar eventdragstop callback 
eventDragStop: function (event, jsEvent, ui, view) { 
    if (isElemOverDiv()) { 

     jQuery('#fr-calendar').fullCalendar('removeEvents', event.id); 

     var trashEl = jQuery('#calendarTrash'); 
     if (trashEl.hasClass("to-trash")) { 
      trashEl.removeClass("to-trash"); 
     } 
    } 
}, 

en fullcalendar dragRevertDuration opción set : 0,

en la declaración fullcalendar añadir la función de devolución de llamada de carga para anexar una trashcalendar:

loading: function (bool) { 
    if (!bool) { 
     jQuery('.fc-header-left').append('<div id="calendarTrash" class="calendar-trash"><img src="' + imagePath + '/cal-trash.png"></img></div>'); 

    } 
}, 

css para la basura:

div.calendar-trash{ 
float: left; 
padding-right: 8px; 
margin-right:5px; 
padding-left:8px; 
padding-top: 3px; 
cursor: pointer; 
} 

.to-trash{ 
    background-color:#EAEAEA; 
    -webkit-border-radius: 5em; 
    border-radius: 5em; 
} 

Si devolución de llamada de carga no funciona, añadir basura en función de fin de lista de documentos jQuery.

foo.JFS('.fc-header-left').append('<div id="calendarTrash" class="calendar-trash"><img src="/images/cal-trash.png"></img></div>'); 

icono de la papelera:

enter image description here

+0

la excelente respuesta! +1 –

Cuestiones relacionadas