将全天事件拖放到完整日历中

问题描述 投票:0回答:1

我有一个完整的日历,包含全天活动和正常活动。我正在使用 fullCalendar 6.1.8 版本。

我在将全天事件从一个全天时段拖放到另一个全天时段时遇到问题。不过,我可以在任何一天将其转到任何其他时段。该事件只是弹回之前的事件。

有什么想法为什么会发生这种情况吗?

<html>

  <head>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/6.1.8/index.global.min.js'></script>

    <script>
      document.addEventListener('DOMContentLoaded', function() {
        var calendarEl = document.getElementById('calendar');

        calendar = new FullCalendar.Calendar(calendarEl, {
          events: [{
              title: 'event1',
              start: '2023-12-12'
            },

          ],
          height: 800,
          initialView: 'timeGridWeek',
          eventColor: '#292b2c',
          headerToolbar: false,
          themeSystem: 'bootstrap5',
          duration: {
            days: 7
          },
          showNonCurrentDates: false,
          slotLabelFormat: {
            hour: 'numeric',
            minute: '2-digit',
            hour12: false,
          },
          firstDay: 1,
          dayHeaderFormat: {
            weekday: 'long'
          },
          eventStartEditable: true,
          eventResizableFromStart: true,
          contentHeight: "auto",
          handleWindowResize: true,
          droppable: true,
          forceEventDuration: true,
          eventOverlap: false,

          eventResize: function(eventResizeInfo) {
            var event = eventResizeInfo.event;
            if (event.start.getDay() !== event.end.getDay()) {
              eventResizeInfo.revert();
            }
          },
          eventDrop: function(eventResizeInfo) {
            var event = eventResizeInfo.event;
            if (event.start.getDay() !== event.end.getDay()) {
              eventResizeInfo.revert();
            }
          },
          eventLeave: function(eventResizeInfo) {
            const event = eventResizeInfo.event;
            event.remove();
          },
          eventContent: function(eventInfo) {
            const event = eventInfo.event;
            const id = event.id;
            if (event.title.length == 0) return "Empty Slot";
            const eventTitle = `<div>${event.title} </div>`;

            return {
              html: `<div class='d-flex flex-column'> ${eventTitle} </div> </div>`
            }
          },
          eventChange: function(info) {
            const events = calendar.getEvents();
          },

          eventReceive: function(event) {
            const events = calendar.getEvents();
            const title = event.event.title;
            const start = event.event.startStr;
            const end = event.event.endStr;
            const allDay = event.event.allDay;

            event.event.remove();

            calendar.addEvent({
              id: generate_uuidv4(),
              title: title,
              start: start,
              end: end,
              wholeDay: allDay,
            });
          },
        });

        calendar.render();

        function getEvents() {
          const events = calendar.getEvents();
        }
      });

    </script>
  </head>

  <body id="body">
    <div class="row" style="width: 100%;">
      <div id='calendar'></div>
    </div>
  </body>

</html>
javascript fullcalendar
1个回答
0
投票

如果您使用 forceEventDuration,它会强制 fullCalendar 设置事件的结束日期。对于全天活动,结束日期始终是第二天的午夜,因为(根据事件对象文档)fullCalendar 中的结束日期是排他性 - 例如,如果您为 12 号创建全天活动,fullCalendar 会将结束日期视为 13 日 00:00:00。

这会导致问题,因为在您的

eventDrop
回调中,您编写了比较开始日期和结束日期的“日”部分的代码,如果天数不相等,则恢复更改。

如果删除

forceEventDuration : true

从设置中,这种情况不再发生 - 演示:https://codepen.io/ADyson82/pen/YzBbGgp

© www.soinside.com 2019 - 2024. All rights reserved.