Как отключить даты между сохраненными событиями в fullcalendar - PullRequest
0 голосов
/ 27 апреля 2018

Я использую полный календарь для создания расписаний. Что я делаю, так это то, что на каждую неделю должно быть только 3 графика (дата обработки, дата выплаты и дата кредита). Если на эту неделю уже есть расписания, мне нужно сообщить пользователю, что расписания уже установлены. Но если расписание не установлено, пользователь все равно может опубликовать новое расписание. Я уже покончил с логикой этого планировщика, единственная проблема, которая у меня есть, - как отключить даты между установленными расписаниями на неделю?

Например, я установил 04-24-2018 (дата обработки), 04-24-18 (дата выплаты) и 04-26-18 (дата кредита).

Как можно отключить 04-22-18,04-23-18,04-25-18,04-27-18 и 04-28-18 на этой неделе, чтобы пользователь не мог создавать новые расписания на эту неделю

график изображения

JAVASCRIPT

select:
            function (start, end, jsEvent, view, resource) {
            IsDateHasEvent(start);
}

function IsDateHasEvent(date) {
    var allEvents = [];
    allEvents = $('#calendar').fullCalendar('clientEvents');
    var event = $.grep(allEvents, function (v) {
        //alert(v.start);
        //return +v.start == +date;
        if (v.start <= date) {
            $("#eventIsAlreadySetModal").modal();
            //alert(v.start);
        }

    });
    return event.length > 0;
}

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

Может ли кто-нибудь помочь мне через это? Большое вам спасибо.

Полный код Javascript

$(document).ready(function () {
    var events = [];
    var selectedEvent = null;
    FetchEventAndRenderCalendar();


    // ******************************************
    // GET ALL SCHEDULES AND DISPLAY IN CALENDAR
    // ******************************************
    function FetchEventAndRenderCalendar() {
        $.ajax({
            type: 'GET',
            url: '@Url.Action("GetSchedule")',
            success: function (data) {
                $.each(data, function (i, v) {
                    var eColor = "";
                    if (v.status == 'Completed')
                    {
                        eColor = '#3498DB';
                    }
                    if (v.status == 'Active') {
                        eColor = '#2CB05B';
                    }
                    if (v.status == 'Pending') {
                        eColor: '#DE6209';
                    }

                    events.push({
                        eventID: v.scheduleId,
                        title: v.processedDescription,
                        start: moment(v.processedDatetimeStart),
                        status: v.status,
                        color: eColor
                    });

                    events.push({
                        eventID: v.scheduleId,
                        title: v.payoutDescription,
                        start: moment(v.payoutDatetimeStart),
                        status: v.status,
                        color: eColor
                    });

                    events.push({
                        eventID: v.scheduleId,
                        title: v.creditDescription,
                        start: moment(v.creditDatetimeStart),
                        status: v.status,
                        color: eColor,
                        end: moment(v.creditDatetimeStart)
                    });


                })


                GenerateCalendar(events);
            },
            error: function (error) {
                alert('failed');
            }
        })
    }


// ******************************************
    // GENERATE THE CALENDAR VIEW AND SCHEDULES
    // ******************************************
    function GenerateCalendar(events) {
        $('#calendar').fullCalendar('destroy');
        $('#calendar').fullCalendar({
            contentHeight: 500,
            header: {
                left: 'prev,next today',
                center: 'title',
                right: 'month, agendaWeek, agendaDay, listWeek'
            },
            navLinks: true,
            editable: true,
            eventLimit: true,
            eventColor: '#2CB05B',

            droppable: false,
            timeFormat: 'h(:mm)A',
            timeZone: 'local',

            events: events,

            // **************************************
            // display the saved schedule in calendar
            // **************************************
            eventClick:
            function (calEvent, jsEvent, view) {                    
                $("#statusLabel").text(calEvent.status);
                $("#schedId").val(calEvent.eventID);
                $("#schedDesc").html(calEvent.title);
                $("#txtDateStart_Edit").val(calEvent.start.format("MM-DD-YYYY HH:mm A"));
                $('#modalEditSchedule').modal();

                if ($("#statusLabel").html() == "Completed")
                {
                    $("#btnEditSched").hide();
                }

                if ($("#statusLabel").html() == "Active") {
                    $("#btnEditSched").hide();
                }

            },

 // *************************************************
            // select dates in calendar for posting new schedule
            // *************************************************
            selectable: true,
            selectOverlap: true,
            select:
            function (start, end, jsEvent, view, resource) {

                IsDateHasEvent(start);
            },

 // *********************************************
            // disable past navigation button for past dates
            // *********************************************
            viewRender: function (currentView) {
                var minDate = moment();
                // Past dates
                if (minDate >= currentView.start) {    
                    $(".fc-prev-button").prop('disabled', true);
                    $(".fc-prev-button").addClass('fc-state-disabled');
                }
                else {
                    $(".fc-prev-button").removeClass('fc-state-disabled');
                    $(".fc-prev-button").prop('disabled', false);
                }
            },

            // ******************************
            // disable past dates in calendar
            // ******************************
            validRange: function (dateNow) {
                return {
                    start: dateNow.subtract(1, 'days')
                };
            }

            , dayClick: function (date) {
                var events = $('#calendar').fullCalendar('clientEvents');
                for (var i = 0; i < events.length; i++) {
                    //if (moment(date).isSame(moment(events[i].start))) {
                    if (moment(events[i].start) <= moment(date)) {
                        alert('with events');
                        break;
                    }
                    else //if (i == events.length - 1) 
                    {
                        alert('none');
                    }
                }
            }
        });
    }

    // **********************************
    // show modal for adding new schedule
    // **********************************
    function openAddEditForm() {
        $('#modalAddSchedule').modal();
    }



});

function IsDateHasEvent(date) {
    var allEvents = [];
    allEvents = $('#calendar').fullCalendar('clientEvents');
    var event = $.grep(allEvents, function (v) {
        //alert(v.start);
        //return +v.start == +date;
        if (v.start <= date) {
            $("#eventIsAlreadySetModal").modal();
            //alert(v.start);
        }

    });
    return event.length > 0;
}

1 Ответ

0 голосов
/ 27 апреля 2018

Вам необходимо:

  • проверьте, есть ли хотя бы 3 расписания на одну и ту же неделю;
  • если есть, отключите другие даты этой недели.

Правильно? Я постараюсь решить первую часть вашей проблемы с javascript Date class . Я не знаю о FullCalendar, поэтому, если кто-нибудь сможет решить эту часть, я буду рад, хе-хе.

Мы должны проверить, когда начинается неделя и когда она заканчивается. Просто с этим мы будем готовы делать сумасшедшие вещи.

function printDate(year, month, day) {
    month = (month < 10 ? '0' : '') + month.toString();
    day = (day < 10 ? '0' : '') + day.toString();
    return year + '-' + month + '-' + day;
}
function weekStart(dateString) {
    var dateObject = new Date(dateString);
    var dayOfWeek = dateObject.getDay();
    if(dayOfWeek > 0) {
        dateObject.setDate(day - dayOfWeek);
    }
    return printDate(dateObject.getFullYear(), dateObject.getMonth()+1, dateObject.getDate());
}

function weekEnd(dateString) {
    var dateObject = new Date(dateString);
    var dayOfWeek = dateObject.getDay();
    if(dayOfWeek < 6) {
        dateObject.setDate(day + (6-dayOfWeek));
    }
    return printDate(dateObject.getFullYear(), dateObject.getMonth()+1, dateObject.getDate());
}
function weekRange(dateString) {
    return [weekStart(dateString), weekEnd(dateString)];
}

Хорошо, теперь мы можем получить "недельный диапазон" от даты. Но откуда мы можем получить все даты этой недели? Конечно.

function getDatesFromWeek(wStart) {
    var dates = [],
        date = new Date(wStart),
        count = 0;
    while(count <= 6) {
        date.setDate(date.getDate() + count);
        dates.push(printDate(date.getFullYear(), date.getMonth()+1, date.getDate());
        count++;
    }
    return dates;
}

Совершенная. Так что теперь мы должны рассчитывать для каждого диапазона. Предполагая, что вы получаете информацию о переменной с именем schedules, и у каждого расписания есть индекс с именем date:

var weeks = {}, lockedDates = [];
for(var x in schedules) {
    var week = weekRange(schedules[x].date);
    var weekID = week.join('-');
    if(weeks[weekID] == undefined) {
        weeks[weekID] = 1;
    } else {
        weeks[weekID]++;
    }
    if(weeks[weekID] == 3) {
        lockedDates = lockedDates.concat(getDatesFromWeek(week[0]));
    }
}

Тогда у вас есть все эти даты для отключения, перечисленные в переменной lockedDates в формате YYYY-MM-DD. Ты умеешь делать все остальное?

EDIT

Давайте изменим последнюю часть, которую я сделал на это:

function Locker() {
     this.dates = [];
     this.weeks = {};
}
Locker.prototype.add = function(dateString) {
    var wStart = weekStart(dateString);
    if(this.weeks[wStart] == undefined) {
        this.weeks[wStart] = 1;
    } else {
        this.weeks[wStart]++;
    }
    if(this.weeks[wStart] == 3) {
        this.lock(getDatesFromWeek(wStart));
    }
}
Locker.prototype.lock = function(dates) {
    this.lockedDates = this.lockedDates.concat(dates);
    // do something
}
var calendarLocker = new Locker();
// everytime an user add a date, call calendarLocker.add(date);
// so when it reaches the limit, the locker will call calendarLocker.lock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...