Перетаскиваемые события из файла Json - PullRequest
0 голосов
/ 18 ноября 2018

Я видел демо для перетаскивания элементов https://fullcalendar.io/docs/external-dragging-demo

В этой демонстрации Мои события 1..5 являются статическими

Можно ли динамически заполнить перетаскиваемый внешний список полного календаря из файла JSON?

Моя идея - показать TITLE как имя моего перетаскиваемого события, а остальные параметры - это дополнительные параметры из моего Fullcalendar.

Я пытался динамически создавать div внешних событий из кода позади, но он больше не был перетаскиваемым.

Спасибо!

 var JsonData = '[{"id":"1","title":"Event Title1","start":"2015-03-17T13:13:55.008","end":"2015-03-19T13:13:55.008"},{"id":"2","title":"Event Title 2","start":"2015-03-17T13:13:55-0400","end":"2015-03-19T13:13:55-0400"}]';

var obj = JSON.parse( JsonData );

var tmp = '';
$.each( obj, function( key, value ) {
  tmp += '<div class="col-md-4 col-sm-4">';
  tmp += '    <div class="fc-event" data-color="#00cc99">';
  tmp += '      <h5>' + value.title + '</h5>';
  tmp += '    </div>';
  tmp += '  </div>';
});

$('#main').prepend(tmp);
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />


  <title>
    Drag-n-drop external events - Demos | FullCalendar
  </title>






<link href='https://fullcalendar.io//assets/demo-topbar.css' rel='stylesheet' />

<link href='https://fullcalendar.io//releases/fullcalendar/3.9.0/fullcalendar.min.css' rel='stylesheet' />
<link href='/https://fullcalendar.io/releases/fullcalendar/3.9.0/fullcalendar.print.css' rel='stylesheet' media='print' />



<script src='https://fullcalendar.io//releases/fullcalendar/3.9.0/lib/moment.min.js'></script>
<script src='https://fullcalendar.io//releases/fullcalendar/3.9.0/lib/jquery.min.js'></script>
<script src='https://fullcalendar.io//releases/fullcalendar/3.9.0/fullcalendar.min.js'></script>







<script src='https://fullcalendar.io//assets/demo-to-codepen.js'></script>



  <script src='https://code.jquery.com/ui/1.11.3/jquery-ui.min.js'></script>
<script>

  $(function() {

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

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

      // store data so the calendar knows to render an event upon drop
      $(this).data('event', {
        title: $.trim($(this).text()), // use the element's text as the event title
        stick: true // maintain when user navigates (see docs on the renderEvent method)
      });

      // 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() {
        // 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>

  html, body {
    margin: 0;
    padding: 0;
    font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif;
    font-size: 14px;
  }

  #external-events {
    position: fixed;
    z-index: 2;
    top: 20px;
    left: 20px;
    width: 150px;
    padding: 0 10px;
    border: 1px solid #ccc;
    background: #eee;
  }

  .demo-topbar + #external-events { /* will get stripped out */
    top: 60px;
  }

  #external-events .fc-event {
    margin: 1em 0;
    cursor: move;
  }

  #calendar-container {
    position: relative;
    z-index: 1;
    margin-left: 200px;
  }

  #calendar {
    max-width: 900px;
    margin: 20px auto;
  }

</style>
</head><body>

  <div class='demo-topbar'>
  <button data-codepen class='codepen-button'>Edit in CodePen</button>

  

  
    Drag external events into the calendar with the help of jquery-ui draggable
  
</div>


  <div id='external-events'>
    <p>
      <strong>Draggable Events</strong>
    </p>
    <div class='main'>    
    </div>
    <div class='fc-event'>My Event 1</div>
    <div class='fc-event'>My Event 2</div>
    <div class='fc-event'>My Event 3</div>
    <div class='fc-event'>My Event 4</div>
    <div class='fc-event'>My Event 5</div>
    <p>
      <input type='checkbox' id='drop-remove' />
      <label for='drop-remove'>remove after drop</label>
    </p>
  </div>

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

</body>


</html>

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вот мое решение.

window.onload = function() {
  $.getJSON( "includes/load_employees.php", function(cgData) {
    var tmp = '';
    $.each(cgData, function(key, value){
      tmp += '  <div class="fc-event calendar-events ui-draggable ui-draggable-handle" data-class="bg-info" data-event="{"fname":"'+value.fname+'","lname":"'+value.lname+'", "title":"'+value.title+'", "id":"'+value.id+'"}" style="position: relative;">';
      tmp += value.title;
      tmp += '  </div>';
    });
    $('#cgMain').prepend(tmp);
    $('#calendar-events .fc-event').each(function(event) {
    // store data so the calendar knows to render an event upon drop
    $(this).data('event', {
      title: $.trim($(this).text()), // use the element's text as the event title
      stick: true // maintain when user navigates (see docs on the renderEvent method)
    });
    // 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
    });
  });
  });
}

Вы должны убедиться, что данные JSON загружаются, в противном случае вы получите неопределенный json (именно поэтому используется window.onload). Кроме того, для перетаскивания и размещения события в календаре важно связать данные события с div.

После размещения события вызываются и drop, и eventReceive.

drop: function(date, jsEvent, ui, resourceId){
      alert("i'm in the drop function");
    },
eventReceive: function(event){
      alert("I'm in the eventReceive function");
      alert(JSON.stringify(event.title, null, 4));
    },

Вот соответствующий HTML:

<div id='calendar-events' class="fc-event m-t-20">
    <div id="cgMain"></div>
</div>
<div class="checkbox">
    <input type='checkbox' id='drop-remove'>
    <label for='drop-remove'>remove after drop</label>
</div>
0 голосов
/ 21 ноября 2018

Вот пример, который может помочь.Вы вызвали селектор $('#main'), но нет элемента с main в качестве идентификатора.Переключение этого на Селектор Класса, кажется, помогает.Попробуйте использовать $('.main').

Пример фрагмента:

$(function() {
  var JsonData = '[{"id":"1","title":"Event Title1","start":"2015-03-17T13:13:55.008","end":"2015-03-19T13:13:55.008"},{"id":"2","title":"Event Title 2","start":"2015-03-17T13:13:55-0400","end":"2015-03-19T13:13:55-0400"}]';

  var obj = JSON.parse(JsonData);

  var tmp = '';
  $.each(obj, function(key, value) {
    tmp += '<div class="col-md-4 col-sm-4">';
    tmp += '    <div class="fc-event" data-color="#00cc99">';
    tmp += '      <h5>' + value.title + '</h5>';
    tmp += '    </div>';
    tmp += '  </div>';
  });

  $('.main').prepend(tmp);

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

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

    // store data so the calendar knows to render an event upon drop
    $(this).data('event', {
      title: $.trim($(this).text()), // use the element's text as the event title
      stick: true // maintain when user navigates (see docs on the renderEvent method)
    });

    // 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() {
      // is the "remove after drop" checkbox checked?
      if ($('#drop-remove').is(':checked')) {
        // if so, remove the element from the "Draggable Events" list
        $(this).remove();
      }
    }
  });
});
html,
body {
  margin: 0;
  padding: 0;
  font-family: "Lucida Grande", Helvetica, Arial, Verdana, sans-serif;
  font-size: 14px;
}

#external-events {
  position: fixed;
  z-index: 2;
  top: 20px;
  left: 20px;
  width: 150px;
  padding: 0 10px;
  border: 1px solid #ccc;
  background: #eee;
}

.demo-topbar+#external-events {
  /* will get stripped out */
  top: 60px;
}

#external-events .fc-event {
  margin: 1em 0;
  cursor: move;
}

#calendar-container {
  position: relative;
  z-index: 1;
  margin-left: 200px;
}

#calendar {
  max-width: 900px;
  margin: 20px auto;
}
<link href='https://fullcalendar.io//releases/fullcalendar/3.9.0/fullcalendar.min.css' rel='stylesheet' />
<script src='https://fullcalendar.io/releases/fullcalendar/3.9.0/lib/moment.min.js'></script>
<script src='https://fullcalendar.io/releases/fullcalendar/3.9.0/lib/jquery.min.js'></script>
<script src='https://fullcalendar.io/releases/fullcalendar/3.9.0/fullcalendar.min.js'></script>
<script src='https://code.jquery.com/ui/1.11.3/jquery-ui.min.js'></script>

<div id='external-events'>
  <p>
    <strong>Draggable Events</strong>
  </p>
  <div class='main'>
  </div>
  <div class='fc-event'>My Event 1</div>
  <div class='fc-event'>My Event 2</div>
  <div class='fc-event'>My Event 3</div>
  <div class='fc-event'>My Event 4</div>
  <div class='fc-event'>My Event 5</div>
  <p>
    <input type='checkbox' id='drop-remove' />
    <label for='drop-remove'>remove after drop</label>
  </p>
</div>

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

</body>


</html>

Вы также можете видеть, что я переместил JavaScript в один блок.Это помогает обеспечить создание контента перед созданием календаря.Затем он ловит изменения и делает их перетаскиваемыми.

...