Полный календарь с использованием ресурсов как функции с меню выбора

Используя Fullcalendar 4, я пытаюсь показать/скрыть свои ресурсы с помощью меню выбора. Когда пользователь выбирает одного из поставщиков из меню, я хочу показать только события этого ресурса.

Над моим полным календарем у меня есть меню выбора:

<select id="toggle_providers_calendar" class="form-control" >
       <option value="1" selected>Screech Powers</option>
       <option value="2">Slater</option>
 </select>

Я собираю необходимые мне ресурсы, используя вызов ajax на моей включенной странице fullcalendar.php. Я сохраняю их в объекте, а затем пытаюсь контролировать, какие ресурсы отображаются на экране:

 document.addEventListener('DOMContentLoaded', function() {


    var resourceData = [];

    $.getJSON('ajax_get_json.php?what=schedule_providers_at_location',
        function(data) {
            $.each(data, function(index) {
                resourceData.push({
                    id: data[index].value,
                    title: data[index].text
                });
            });
        console.log(resourceData);
        });

    //below, set the visible resources to whatever is selected in the menu
    //using 1 in order for that to show at start
    var visibleResourceIds = ["1"];

    //below, get the selected id when the the menu is changed and use that in the toggle resource function
    $('#toggle_providers_calendar').change(function() {
        toggleResource($('#toggle_providers_calendar').val());
    });

    var calendar_full = document.getElementById('calendar_full');
    var calendar = new FullCalendar.Calendar(calendar_full, {
        events: {
            url: 'ajax_get_json.php?what=location_appointments'
        },
        height: 700,
        resources: function(fetchInfo, successCallback, failureCallback) {

                // below, I am trying to filter resources by whether their id is in visibleResourceIds.
                var filteredResources = [];

                filteredResources = resourceData.filter(function(x) {
                  return visibleResourceIds.indexOf(x.id) !== -1;
                });

                successCallback(filteredResources);

        },
       ...
       });

       // below, my toggle_providers_calendar will trigger this function. Feed it resourceId.
      function toggleResource(resourceId) {
        var index = visibleResourceIds.indexOf(resourceId);
        if (index !== -1) {
          visibleResourceIds.splice(index, 1);
        } else {
          visibleResourceIds.push(resourceId);
        }

        calendar.refetchResources();
      }

Чтобы убедиться, что getJSON работает, у меня есть console.log(resourceData). Информация в консоли после ее сбора:

[{id: '1', title: 'Screech Powers'}, {id: '2', title: 'Slater}]

... выше приведены правильные ресурсы, которые можно выбрать/рендерить. Так что, кажется, все в порядке.

При загрузке страницы ресурсы вообще не отображаются, когда идентификатор ресурса «1» (Screech Powers) должен отображаться в соответствии с моим кодом. Ну, по крайней мере, это то, что я пытаюсь сделать прямо сейчас.

При изменении меню ресурсы будут отображаться/скрываться, но не в зависимости от того, что выбрано; логика отображения только того, что выбрано в меню, похоже, не работает.

Раньше я использовал URL-запрос для своих ресурсов: «ajax_get_json.php?what=schedule_providers_at_location», и это работало нормально! Все ресурсы правильно отображают свои события. Я просто пытаюсь изменить его, используя меню, чтобы показать/скрыть ресурсы по мере необходимости.


person chris.cavage    schedule 24.06.2019    source источник


Ответы (1)


Вот что я делаю, чтобы это произошло до сих пор! Если кто-то когда-нибудь наткнется на этот пост, это поможет.

Вот мой код перед кодом полного календаря.

    var resourceData = [];
    var visibleResourceIds = [];

    $.getJSON('ajax_get_json.php?what=schedule_providers_at_location',
        function(data) {
            $.each(data, function(index) {
                resourceData.push({
                    id: data[index].value,
                    title: data[index].text
                });

            });
        });


    $('#toggle_providers_calendar').change(function() {
        toggleResource($('#toggle_providers_calendar').val());
    });

Мое меню выбора с идентификатором toggle_providers_calendar такое же, как и в моем исходном сообщении. Мои ресурсы полного календаря как функция тоже такие же.

После рендеринга календаря я внес изменения в функцию переключения ресурсов:

    // menu button/dropdown will trigger this function. Feed it resourceId.
    function toggleResource(resourceId) {
        visibleResourceIds = [];

        //if select all...  see if undefined from loading on initial load = true
        if ((resourceId == '') || (resourceId === undefined)) {

            $.map( resourceData, function( value, index ) {
                 visibleResourceIds.push(value.id);
            });

        }

      var index = visibleResourceIds.indexOf(resourceId);
      if (index !== -1) {
        visibleResourceIds.splice(index, 1);
      } else {
        visibleResourceIds.push(resourceId);
      }

      calendar.refetchResources();

    }

Это приводит к правильному отображению и скрытию ресурсов. Если пользователь выбирает «Показать все», это тоже работает!

Чтобы при загрузке отображался ресурс по умолчанию, я добавляю это в свой скрипт fullcalendar:

        loading: function(bool) {

        if (bool) {
            //insert code if still loading
            $('.loader').show();
        } else {
            $('.loader').hide();

            if (initial_load) {
                initial_load = false;
                //code here once done loading and initial_load = true                 
                var default_resource_to_show = "<?php echo $default_provider; ?>";
                if (default_resource_to_show) {
                    //set the menu to that provider and trigger the change event to toggleresrource()
                    $('#toggle_providers_calendar').val(default_provider).change();
                } else {
                    //pass in nothing meaning 'select all' providers for scheduler to see
                    toggleResource();
                }
            }
        }

    },

Я использую логическую переменную initial_load, чтобы узнать, была ли страница только что загружена (в основном не загружая данные без обновления страницы). Логическое значение initial_load = true установлено за пределами DOMContentLoaded.

<script>
//show selected date in title box
var initial_load = true;
 document.addEventListener('DOMContentLoaded', function() {

Моя единственная текущая проблема заключается в том, что при вызове функции toggleResource границы блока вертикального времени в течение всего дня не совпадают с остальной частью планировщика. Как только я начинаю навигацию, они это делают, но я не понимаю, почему это выглядит так при начальной загрузке или при вызове toggleResource():

введите здесь описание изображения

Любые мысли о том, как исправить выравнивание вертикальных блоков allday?

person chris.cavage    schedule 25.06.2019
comment
По предложению одного из участников я начал новую тему/вопрос, основанный на этой проблеме. - person chris.cavage; 25.06.2019