Как изменить цвет ячейки enitre, если одна и та же дата имеет более 3 событий, используя полный календарь

Я использую полный календарь для создания дат и отображения событий. все работает нормально, но мне нужна дополнительная функция, т.е. я хочу изменить цвет ячейки на красный, если в ней более 3 событий. Если у даты более 3 функций / событий, тогда цвет всей ячейки должен измениться на красный цвет. Чтобы пользователь мог знать, что бронирование заполнено. Я также приклеил скриншот ниже

Ниже мой код: -

 function clickmeforcalender(event) {

    debugger


    $('#calendar').show();
    var events = [];
    $.ajax({
        type: "GET",
        url: "/Booking/GetEvents",
        success: function (data) {
            $.each(data, function (i, a) {

                events.push({

                    title: a.Function_Name,
                    start: a.Function_Date1,
                    url: a.Booking_ID,
                    FSlot: a.Function_Slot,
                    MSlot: a.Marquee_Name,
                    Marquee_Slot: a.Marquee_Slot,
                    BPerson: a.Booking_Person,
                    BookedBy: a.Booking_Name,
                });

                $("#calendar").css("background-color", "WHITE");
            })
            var allEvents = $(".calendar").fullCalendar("clientEvents");

            var exists = 0;
            $.each(allEvents, function (index, value) {

                if (new Date(value.start).toDateString() === new Date(date).toDateString()) {
                    exists++;
                    if (exists == 2) {

                        value.css("background-color", "red");
                    }

                }

            });
            GenerateCalender(events);
        },

        error: function (error) {
            alert('failed');
        }
    });
};
function GenerateCalender(events) {
    debugger
    $('#calendar').fullCalendar({
        height: 550,

        header: {
            left: 'prev,next today',
            center: 'addEventButton',
            right: 'month,agendaWeek,agendaDay,listWeek',

        },

        defaultDate: new Date(),
        navLinks: true,
        editable: true,
        eventLimit: true,
        events: events,



        eventClick: function (calEvent, jsEvent, view) {
            selectedEvent = calEvent;
            //alert('Event: ' + calEvent.title);
            jsEvent.preventDefault();
            $('#myModal #eventTitle').text(calEvent.BookedBy + "-" + calEvent.title).css("font-weight", "Bold");
            var $description = $('<div/>');
            $description.append($('<p/>').html('<b>FucntionDate:</b>' + calEvent.start.format("DD-MMM-YYYY HH:mm")));
            //if (calEvent.end != null) {
            //    $description.append($('<p/>').html('<b>End:</b>' + calEvent.end.format("DD-MMM-YYYY HH:mm a")));
            //}
            $description.append($('<p/>').html('<b>EventName:</b>' + calEvent.title));
            if (calEvent.MSlot == 1) {
                $description.append($('<p/>').html('<b>MaqueeSlot:</b>' + "Full"));
            }
            else if (calEvent.MSlot == 2) {
                $description.append($('<p/>').html('<b>MaqueeSlot:</b>' + "Half"));

            }
            else {
                $description.append($('<p/>').html('<b>MaqueeSlot:</b>' + calEvent.MSlot));
            }
            if (calEvent.FSlot == 1) {
                $description.append($('<p/>').html('<b>FunctionSlot:</b>' + "Morning"));
            }
            else if (calEvent.FSlot == 2) {
                $description.append($('<p/>').html('<b>FunctionSlot:</b>' + "Evening"));
            }
            else {
                $description.append($('<p/>').html('<b>FunctionSlot:</b>' + calEvent.FSlot));
            }
            $description.append($('<p/>').html('<b>Booking Persons:</b>' + calEvent.BPerson));

            $('#myModal #pDetails').empty().html($description);

            var temp = $('#myModal').modal();



        },


    });
}

Снимок экрана моего интерфейса выглядит следующим образом: -  введите описание изображения здесь


person Khizar Nayyar    schedule 09.09.2019    source источник
comment
В этом вам могут быть полезны следующие обратные вызовы и методы: eventAfterAllRender, clientEvents и эти статьи.   -  person ADyson    schedule 10.09.2019
comment
Я также настоятельно рекомендую вам изменить свой код, чтобы использовать события в качестве шаблона канала JSON что а) упростит ваш код и б) позволит вам загружать только те события, которые вам действительно нужны в течение периода времени, который не оплачивается (потому что ваш сервер может фильтровать их по датам начала / окончания, автоматически предоставляемым fullCalendar). Это, в свою очередь, поможет удовлетворить ваши требования, указанные выше, потому что у вас будет меньше событий для поиска, а выделение может обновляться более динамично по мере добавления / удаления / обновления событий.   -  person ADyson    schedule 10.09.2019
comment
Надеюсь, используя вышеизложенное, вы сможете лучше попытаться решить свою проблему. Если после нескольких попыток вы все еще застряли, покажите обновленный код, чтобы мы могли немного помочь. Спасибо.   -  person ADyson    schedule 10.09.2019
comment
Я пробовал несколько решений, но безрезультатно. Просто хочу узнать, в какие даты происходит более трех событий, поэтому я могу изменить цвет фона всей ячейки.   -  person Khizar Nayyar    schedule 10.09.2019
comment
Хорошо, но мы не сможем исправить ваши попытки, если вы нам не покажете. Покажите нам свою лучшую попытку, пожалуйста. И изучите те ссылки, которые я дал - как я уже сказал, это должно дать вам подсказку, что делать. (Подсказка: дождитесь отображения всех событий. Затем получите список всех событий на странице. Сгруппируйте эти события по дате. Для любой отдельной даты, имеющей 3 или более событий, измените цвет фона для соответствующей ячейки даты. Эта логика не сложно.)   -  person ADyson    schedule 10.09.2019
comment
Сэр, я использовал решения / ответы по переполнению стека, предоставленные по той ссылке, которую вы упомянули. Я упоминаю ниже последний закрытый, в котором я являюсь eventRender: function (event, element, view) {/ var dateString = moment (event.start) .format ('ГГГГ-ММ-ДД'); $ ('# календарь'). find ('. fc-day [дата-дата =' + dateString + ']'). css ('цвет фона', '# FAA732'); }, Он меняет цвет всех дат, в которых есть события. Я даже проверил ваше решение jsfiddle.net/3hw4852y/21 и внес несколько изменений.   -  person Khizar Nayyar    schedule 10.09.2019
comment
Итак, в этом коде JSFiddle вы получили ошибку dateString is not defined в консоли. Вы это заметили? Вам необходимо установить подходящую дату для внесения изменений. Также вы делаете это только в eventReceive, поэтому он будет работать только тогда, когда событие перетаскивается в календарь. Это не относится к другим событиям. Если вы посмотрите на мой последний комментарий, вы увидите, как его можно применить ко всем ситуациям.   -  person ADyson    schedule 10.09.2019
comment
Здесь я со своим кодом. Используется eventAfterAllRender и ClientEvents. Я пытаюсь получить даты всех событий в формате даты, но он возвращает мне [объект]. eventAfterAllRender: функция (просмотр) {отладчик var allEvents = $ (# календарь) .fullCalendar (clientEvents); var array = $ ('# calendar'). fullCalendar ('clientEvents', function (events) {return (moment (allEvents) .format ('ГГГГ-ММ-ДД'));}); alert (массив)},   -  person Khizar Nayyar    schedule 11.09.2019
comment
это потому, что вы не можете предупредить массив. Вы в основном говорите Javascript отображать массив в виде строки на экране. Но он не знает, как вы хотите представить данные, поэтому вместо этого просто говорит объект. Это не значит, что с вашим кодом или данными что-то не так. Если вы хотите проверить данные, которые у вас есть, лучший способ: а) зарегистрировать их в консоли (чтобы вы могли видеть сразу несколько журналов, скопировать / вставить их и т. Д.) И б) отформатировать их как JSON для удобства чтения. . Поэтому замените alert(array); на console.log(JSON.stringify(array)); и откройте консоль. Вы должны получить более полезный результат.   -  person ADyson    schedule 11.09.2019
comment
Я попадаю на консоль VM520 Бронирование: 597 Uncaught TypeError: преобразование круговой структуры в JSON   -  person Khizar Nayyar    schedule 11.09.2019
comment
Ok. Просто заметил, что ваш код для clientEvents вообще не имеет никакого смысла. Вы вызываете clientEvents один раз, что дает вам все события. Затем по какой-то причине вы вызываете его снова, но предоставляя обратный вызов и внутри обратного вызова вы пытаетесь преобразовать список allEvents в объект momentJS. Я удивлен, что в одном случае это не вызывает ошибки, но это также совершенно нелогично.   -  person ADyson    schedule 11.09.2019
comment
Смысл обратного вызова в clientEvents заключается в том, что он будет запускаться один раз для каждого события в списке, что дает вам возможность решить, возвращать его в окончательный список или нет.   -  person ADyson    schedule 11.09.2019
comment
Но для этого это не нужно - нужно вернуть все события. А затем вам понадобится ваш собственный цикл, чтобы смотреть на каждое событие, смотреть на его дату, а затем обновлять свои счетчики, показывая, сколько событий происходит в каждый найденный вами день.   -  person ADyson    schedule 11.09.2019
comment
Сэр, я не могу найти никакого решения, спасибо за ваше время и заботу   -  person Khizar Nayyar    schedule 11.09.2019


Ответы (1)


Я вижу, что вы предприняли некоторые усилия, чтобы попытаться решить эту проблему (согласно комментариям), но у вас, похоже, возникли некоторые проблемы с реализацией предложенного алгоритма в JavaScript.

Напомним, что основной процесс выполнения того, что вы хотите, заключается в следующем:

1) дождитесь завершения загрузки всех событий в календаре

2) получить список всех видимых в данный момент событий

3) Ведите список счетчиков, которые записывают, сколько событий происходит в определенный день. Затем проверьте дату начала каждого события и увеличьте счетчик даты на единицу для каждого совпадающего события.

4) После проверки всех событий посмотрите на каждый счетчик. Если какой-либо из них записывает более 3-х событий, измените цвет фона ячейки для этого дня в календаре.

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

Вот простое решение для этого:

eventAfterAllRender: function(view) { //wait till all events have loaded and rendered
  //get all events
  var events = $("#calendar").fullCalendar("clientEvents");
  var dates = {}; //this object will hold the list of dates on which events occur, and the number of events occurring on those dates

  //loop through all the events
  events.forEach(function(ev, index) {
    var startDateStr = ev.start.format("YYYY-MM-DD");
    //either 
    //a) create a new entry for the event's start date and set it to 1, OR
    //b) increase the count of the entry for that date, if it already exists
    // this will build up a list of all dates on which events start, and record how many events start on each of those days
    //it does this by using an empty object, and then adding keys to that object - the key is the date, and the value is the count of events for that date
    dates[startDateStr] = (dates[startDateStr] + 1 || 1);
  });

  //log for debugging / illustration
  console.log(dates);

  //loop through the list of dates which contain events
  for (var dt in dates) {
    //check the count of events for that date. If the count is 3 or more, then change the cell colour for that date in fullCalendar
    if (dates[dt] > 3) {
      $('#calendar').find('.fc-day[data-date="' + dt + '"]').css('background-color', '#FAA732');
    }
  }
}

Живая демонстрация: http://jsfiddle.net/9zupvcfo/2/

person ADyson    schedule 12.09.2019
comment
Большое спасибо за ваш код и простые инструкции. Теперь все продолжено, и код очищен. - person Khizar Nayyar; 12.09.2019