Большой календарь React с перетаскиванием - PullRequest
1 голос
/ 13 июля 2020

Я разрабатываю приложение для своей некоммерческой организации на основе большого календаря. Мне нужно использовать функцию перетаскивания. Я могу перетащить событие из слота в другую позицию, но событие не остается на месте и возвращается в прежнее положение. Все остальные функции работают нормально: создание и редактирование событий. Вот код

import React, { useState, useEffect } from 'react';
import { Calendar, momentLocalizer } from 'react-big-calendar';
import withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop';
import moment from 'moment';
import 'moment/locale/fr';
import Modal from 'react-bootstrap/Modal';
import CalendarForm from './CalendarForm';
import { observer } from 'mobx-react';
import { getCalendar } from './requests';

const localizer = momentLocalizer(moment);
const DnDCalendar = withDragAndDrop(Calendar);
const HomePage = ({ calendarStore }) => {
  const [showAddModal, setShowAddModal] = useState(false);
  const [showEditModal, setShowEditModal] = useState(false);
  const [calendarEvent, setCalendarEvent] = useState({});
  const [initialized, setInitialized] = useState(false);
  let today = new Date();
  const hideModals = () => {
    setShowAddModal(false);
    setShowEditModal(false);
  };

  const getCalendarEvents = async () => {
    const response = await getCalendar();
    const evs = response.data.map((d) => {
      return {
        ...d,
        start: new Date(d.start),
        end: new Date(d.end),
      };
    });
    calendarStore.setCalendarEvents(evs);
    setInitialized(true);
  };
  const handleSelect = (event, e) => {
    const { start, end } = event;
    const data = { title: '', subject: '', start, end, allDay: false };
    setShowAddModal(true);
    setShowEditModal(false);
    setCalendarEvent(data);
  };
  const handleSelectEvent = (event, e) => {
    setShowAddModal(false);
    setShowEditModal(true);
    let { id, title, subject, start, end, allDay } = event;
    start = new Date(start);
    end = new Date(end);
    const data = { id, title, subject, start, end, allDay };
    setCalendarEvent(data);
  };
  const handleDragEvent = (event, e) => {
    setShowAddModal(false);
    setShowEditModal(false);
    let { id, title, subject, start, end, allDay } = event;
    start = new Date(start);
    end = new Date(end);
    const data = { id, title, subject, start, end, allDay };
    setCalendarEvent(data);
  };

  useEffect(() => {
    if (!initialized) {
      getCalendarEvents();
    }
  });

  return (
    <div className="page">
      <Modal show={showAddModal} onHide={hideModals}>
        <Modal.Header closeButton>
          <Modal.Title>Ajouter une session</Modal.Title>
        </Modal.Header>
        <Modal.Body>
          <CalendarForm
            calendarStore={calendarStore}
            calendarEvent={calendarEvent}
            onCancel={hideModals.bind(this)}
            edit={false}
          />
        </Modal.Body>
      </Modal>
      <Modal show={showEditModal} onHide={hideModals}>
        <Modal.Header closeButton>
          <Modal.Title>Editer la session</Modal.Title>
        </Modal.Header>
        <Modal.Body>
          <CalendarForm
            calendarStore={calendarStore}
            calendarEvent={calendarEvent}
            onCancel={hideModals.bind(this)}
            edit={true}
          />
        </Modal.Body>
      </Modal>
      <DnDCalendar
        localizer={localizer}
        events={calendarStore.calendarEvents}
        startAccessor="start"
        endAccessor="end"
        defaultView="week"
        selectable={true}
        resizable={true}
        onEventDrop={handleDragEvent}
        style={{ height: '70vh' }}
        onSelectSlot={handleSelect}
        onSelectEvent={handleSelectEvent}
        min={
          new Date(today.getFullYear(), today.getMonth(), today.getDate(), 8)
        }
        max={
          new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23)
        }
        messages={{
          month: 'mois',
          week: 'semaine',
          day: 'jour',
          today: "aujourd'hui",
          next: 'suiv.',
          previous: 'préc.',
        }}
        resource="Test ressource"
        eventPropGetter={(event) => ({
          style: {
            backgroundColor: event.isDone === true ? '#ad4ca4' : '#3174ad',
          },
        })}
      />
    </div>
  );
};

export default observer(HomePage);

...