полный календарь добавляет ограничение при попытке добавить внешнее событие, уже существующее в день

#javascript #fullcalendar

#javascript #полный календарь

Вопрос:

Я использую FullCalendar с Javascript, и я хотел бы перетаскивать внешние события в календарь с помощью перетаскиваемого API. Моя проблема в том, что я не знаю, как проверить, не существует ли событие, которое я хотел бы добавить, в один из дней в календаре.

Например, у меня есть список внешних событий [Event1, Event2 ...] , и в календаре у меня есть день 23-12-2020 с именем события 'Event1' . Итак, я хотел бы заблокировать пользователя, когда он попытается добавить Event1 в день 23-12-2020 , и разрешить им добавлять это событие туда, куда они хотят.

 <div id='external-events'>
  <p>
    <strong>Draggable Events</strong>
  </p>

  <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
    <div class='fc-event-main'>My Event 1</div>
  </div>
  <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
    <div class='fc-event-main'>My Event 2</div>
  </div>
  <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
    <div class='fc-event-main'>My Event 3</div>
  </div>
  <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
    <div class='fc-event-main'>My Event 4</div>
  </div>
  <div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
    <div class='fc-event-main'>My Event 5</div>
  </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>
 
 html, body {
  margin: 0;
  padding: 0;
  font-family: Arial, Helvetica Neue, Helvetica, 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;
}

#external-events .fc-event {
  cursor: move;
  margin: 3px 0;
}

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

#calendar {
  max-width: 1100px;
  margin: 20px auto;
}
 
 document.addEventListener('DOMContentLoaded', function() {
  var Calendar = FullCalendar.Calendar;
  var Draggable = FullCalendar.Draggable;

  var containerEl = document.getElementById('external-events');
  var calendarEl = document.getElementById('calendar');
  var checkbox = document.getElementById('drop-remove');

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

  new Draggable(containerEl, {
    itemSelector: '.fc-event',
    eventData: function(eventEl) {
      return {
        title: eventEl.innerText
      };
    }
  });

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

  var calendar = new Calendar(calendarEl, {
    headerToolbar: {
      left: 'prev,next today',
      center: 'title',
      right: 'dayGridMonth,timeGridWeek,timeGridDay'
    },
    editable: true,
    droppable: true, // this allows things to be dropped onto the calendar
    drop: function(info) {
      // is the "remove after drop" checkbox checked?
      if (checkbox.checked) {
        // if so, remove the element from the "Draggable Events" list
        info.draggedEl.parentNode.removeChild(info.draggedEl);
      }
    }
  });

  calendar.render();
});

 function getEvents(date){
        all_events.forEach(function(entry) {
            if (entry['start'] == date.format()){
                alert(entry['title']);}
            else if (entry['start'] <= date.format() amp;amp; entry['end'] >= date.format()){
                alert(entry['title']);}
         });
    
    }
 

Комментарии:

1. Посмотрите на fullcalendar.io/docs/eventReceive . В этом обратном вызове вы можете просмотреть входящее событие, которое затем позволит вам сравнить его с существующими событиями в вашем календаре, чтобы узнать, хотите ли вы разрешить его или нет. Если вы не хотите его разрешать, есть функция обратного вызова, которую вы можете вызвать, чтобы отменить добавление события.