Можно ли удалить источники событий и динамически добавлять их обратно на основе имени представления?

Я пытаюсь настроить календарь с несколькими представлениями, которые все идентичны, за исключением событий, отображаемых в каждом. Я могу удалить EventSource по идентификатору с помощью обратного вызова viewSkeleton Render, но я не могу добавить EventSource обратно в календарь.

Мы тщательно искали способы переключения видимости и тому подобное - но большинство результатов относятся к предыдущим версиям FullCalendar - пытаясь выполнить это в v4.

Сокращенный тестовый пример: https://codepen.io/jacobcboe/pen/MReJep

На самом деле я пытаюсь сделать это с помощью Google Calendar EventSources, но для простоты использовал события массива для тестового примера.

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

  var calendar = new FullCalendar.Calendar(calendarEl, {
    plugins: [ 'timeGrid' ],
    views: {
	    view1: {
			type: 'timeGrid',
			duration: { days:7 },
			buttonText: 'view1'
		},
		view2: {
			type: 'timeGrid',
			duration: { days:7 },
			buttonText: 'view2'
		},
		view3: {
		    type: 'timeGrid',
			duration: { days:7 },
			buttonText: 'view3'
		},
		view4: {
			type: 'timeGrid',
			duration: { days:7 },
			buttonText: 'view4'
		}			
	},
    defaultView: 'view1',
    defaultDate: '2019-04-05',
    header: {
      left: 'view1,view2,view3,view4',
      center: '',
      right: ''
    },
    eventSources: [
      {
        id:'1',
        events: [
        {
          title: 'All Day Event',
          start: '2019-04-05'
        },
        {
          title: 'Long Event',
          start: '2019-04-06',
          end: '2019-04-07'
        }]
      },
      {
        id:'2',
        events:[
          {
            groupId: '999',
            title: 'Repeating Event',
            start: '2019-04-05T16:00:00'
          },
          {
            groupId: '999',
            title: 'Repeating Event',
            start: '2019-04-06T16:00:00'
          },
          {
            title: 'Conference',
            start: '2019-04-05',
            end: '2019-04-10'
          }]
      },
      {
        id:'3',
        events: [
          {
        title: 'Meeting',
        start: '2019-04-09T10:30:00',
        end: '2019-04-09T12:30:00'
      },
      {
        title: 'Lunch',
        start: '2019-04-08T12:00:00'
      },
      {
        title: 'Meeting',
        start: '2019-04-12T14:30:00'
      },
      {
        title: 'Birthday Party',
        start: '2019-04-07T07:00:00'
      },
      {
        title: 'Click for Google',
        url: 'http://google.com/',
        start: '2019-04-11'
      }]
      }
    ],
    viewSkeletonRender: function(info) {
      var eventSourceOne = calendar.getEventSourceById('1');
      eventSourceOne.remove();
      var eventSourceTwo = calendar.getEventSourceById('2');
      eventSourceTwo.remove();
      var eventSourceThree = calendar.getEventSourceById('3');
      eventSourceThree.remove();
      //also tried calendar.getEvents() with remove
      var viewName = info.view
      if(viewName.type =='view1'){
        calendar.addEventSource(eventSourceOne);
        //have also tried eventSourceOne.refetch()
      }
      if(viewName.type =='view2'){
        calendar.addEventSource(eventSourceTwo);
      }
      if(viewName.type =='view3'){
        calendar.addEventSource(eventSourceThree);
      }
      if(viewName.type =='view4'){
        calendar.addEventSource(eventSourceOne);
        calendar.addEventSource(eventSourceTwo);
        calendar.addEventSource(eventSourceThree);
      }
    }
  });

  calendar.render();
});
html, body {
  margin: 0;
  padding: 0;
  font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
  font-size: 14px;
}

#calendar {
  max-width: 900px;
  margin: 40px auto;
}
<script src="https://fullcalendar.io/releases/timegrid/4.0.1/main.min.js"></script>
<script src="https://fullcalendar.io/releases/daygrid/4.0.1/main.min.js"></script>
<script src="https://fullcalendar.io/releases/interaction/4.0.2/main.min.js"></script>
<script src="https://fullcalendar.io/releases/core/4.0.2/main.min.js"></script>
<link href="https://fullcalendar.io/releases/timegrid/4.0.1/main.min.css" rel="stylesheet"/>
<link href="https://fullcalendar.io/releases/daygrid/4.0.1/main.min.css" rel="stylesheet"/>
<link href="https://fullcalendar.io/releases/core/4.0.2/main.min.css" rel="stylesheet"/>
<div id='calendar'></div>


person jacobcboe    schedule 05.04.2019    source источник
comment
Почему вы хотите отображать разные события для каждого просмотра? Идея представлений состоит в том, чтобы просто дать разные способы представления одной и той же информации. Какой для этого вариант использования? fullCalendar на самом деле не предназначен для того, что вы описываете, хотя я думаю, что это возможно. Но сначала меня интересует, зачем это нужно   -  person ADyson    schedule 06.04.2019
comment
Я пытаюсь создать семейный календарь с отфильтрованными представлениями для каждого члена семьи (все события отображаются по умолчанию, но с кнопкой, чтобы отображать только события из календаря одного человека). Очевидно, это можно сделать в календаре Google, но на веб-сайте это размещено с другой информацией, которая будет отображаться в доме, поэтому он должен выглядеть лучше, чем календарь Google - следовательно, fullcalendar.   -  person jacobcboe    schedule 07.04.2019
comment
Хорошо, но, насколько я понимаю, от вас не требуется использовать viewkeletonrender. Например, если пользователь переходит с месяца на неделю, вам не нужно перезагружать события. Это просто другой способ отображения одних и тех же.   -  person ADyson    schedule 07.04.2019
comment
Если у вас есть список членов семьи, похоже, вы, вероятно, захотите отобразить список рядом с календарем и сделать их интерактивными. Щелчок по каждому из них запускает событие, в котором вы добавляете / удаляете события этого человека из календаря (путем добавления / удаления источника событий, связанного с этим человеком)   -  person ADyson    schedule 07.04.2019
comment
Да, мне, конечно, не нужно использовать Views для этого, это просто казалось простым способом получить кнопки в верхней части календаря. Я не думал, что имеет значение, что запускает код, но я попробую это с помощью кнопок для добавления / удаления источников событий и посмотрю, работает ли это.   -  person jacobcboe    schedule 18.04.2019
comment
Я создал вилку на кодовом пене (codepen.io/jacobcboe/pen/GLxBKM) и удалил представления и вместо этого использовали настраиваемые кнопки. Я могу удалить все события из календаря одним нажатием кнопки, но после этого я не могу повторно добавить определенный источник событий. Я пробовал как calendar.getEventSources - ›eventSources.remove (), так и calendar.getEvents -› перебирать массив и удалять каждое - оба будут удалять события, но события не могут быть добавлены обратно после. Есть какие-нибудь рекомендации о том, как вернуть события в календарь после удаления?   -  person jacobcboe    schedule 18.04.2019
comment
Я действительно не понимаю, что вы пытаетесь там сделать ... вы удаляете некоторые события по отдельности, а затем вы получаете существующий источник событий (который к настоящему времени, вероятно, не имеет в нем событий, поскольку вы их удалили) и пытаетесь снова добавить его в календарь (не удаляя сам источник события).   -  person ADyson    schedule 19.04.2019
comment
Я думаю, вам нужно каждый раз удалять соответствующий источник событий, а не отдельные события. А затем добавьте обратно в другой источник событий, если он был удален ранее.   -  person ADyson    schedule 19.04.2019
comment
Вот попробуйте эту версию: codepen.io/anon/pen/oOdvZv. Обратите внимание, как а) я храню источники событий отдельно в массиве, чтобы вы могли вернуть их после того, как удалили их из календаря, и б) я только добавляю и удаляю источники, а не отдельные события.   -  person ADyson    schedule 19.04.2019
comment
P.S. Идея настраиваемых кнопок интересна, но не очень хорошо масштабируется, если вам нужно несколько из них. Вам понадобится лучший способ сопоставления источников событий, принадлежащих той или иной кнопке, чем просто его жесткое кодирование.   -  person ADyson    schedule 19.04.2019