Fullcalendar 完整日历重复事件限制(使用道琼斯指数)

Fullcalendar 完整日历重复事件限制(使用道琼斯指数),fullcalendar,Fullcalendar,我一直在尝试在fullcalendar中创建重复事件,我真的觉得dow功能很有用,但我真的想在其中添加日期范围 换句话说,道琼斯指数[1]将在每周一重复一项任务,问题是,我想让它只在我设置的日期范围内可见。您可以设置范围,如下例所示: repeatingEvents.push({ title: "From: " + inputDateStart + " To: " + inputDateFinish, start: vm.timeStart, en

我一直在尝试在fullcalendar中创建重复事件,我真的觉得dow功能很有用,但我真的想在其中添加日期范围


换句话说,道琼斯指数[1]将在每周一重复一项任务,问题是,我想让它只在我设置的日期范围内可见。

您可以设置范围,如下例所示:

repeatingEvents.push({
        title: "From: " + inputDateStart + " To: " + inputDateFinish,
        start: vm.timeStart,
        end: vm.timeFinish,
        dow: listDay,
        ranges: [{
            start: dateStart,
            end: dateFinish
        }]
    })

    $("#calendar").fullCalendar("refetchEvents");

因此,您可以同时使用“道指”和“区间”。希望对你有所帮助

不能使用dow设置范围,必须执行一些自定义功能

假设您已从包含多个事件对象的数据库中获取事件数据。每个
事件
对象都有
开始
日期结束日期属性,还有
属性,这些属性包含日期范围,
isRecurring
是一个布尔属性,我们将在重复事件的情况下添加
true
,否则它将是
false

记住,重复事件的开始时间和结束时间不带日期,您只需给它们指定时间段,如
start=“16:00”和end=“20:00”
您可以像初始化事件对象时一样,使用矩js提取时间

                {
                  title:'Recurring Event',
                  start: moment.utc(event.start).format('HH:mm'),
                  end: moment.utc(event.end).format('HH:mm'),
                  isRecurrring: event.isRecurring,
                  ranges: [{
                      start: moment(event.from),
                      end: moment(event.to),
                    }],
                }
我使用了矩.utc()来忽略时区

现在,在初始化fullCalendar时覆盖eventRender函数。您的eventRender函数将是

eventRender: function(event, element, view){
    if (event.isRecurrring) {
      return (event.ranges.filter(function(range){
        return (moment(event.start).isBefore(range.end) &&
        moment(event.end).isAfter(range.start));
      }).length) > 0;
    }
  }
函数createCalendar(){
vm.uiConfig=timeProfileFactory.getCalendarConfig();
vm.uiConfig.calendar.eventClick=eventClick;
vm.uiConfig.calendar.eventDrop=alertOnDrop;
vm.uiConfig.calendar.eventResize=alertOnResize;
vm.uiConfig.calendar.eventRender=eventRender;
vm.uiConfig.calendar.select=selectSlot;
vm.uiConfig.calendar.header.center=“title”;
vm.events=函数(开始、结束、时区、回调){
回调(重复事件);
}
vm.eventSources=[vm.events];
};
函数selectSlot(开始、结束、jsEvent、视图){
var allDay=!start.hastinme()&&!end.hastinme();
变量偏移量=((新日期()).getTimezoneOffset())/60;
var dateStart=(新日期(开始)).setHours(0,0,0,0);
dateStart=新日期(dateStart);
dateStart.setHours(dateStart.getHours()-offset);
dateStart=dateStart.toISOString();
var timeStart=(新日期(开始)).toISOString();
var timeEnd=(新日期(end)).toISOString();
timeStart=timeStart.split('T')[0];
timeEnd=timeEnd.split('T')[0];
var length=repeatingEvents.length;
if(positionEvent=-1 | | repeatingEvents.length==0){
positionEvent=0;
}否则{
positionEvent=repeatingEvents[length-1]。位置+1;
}
重复事件({
标题:“From:”+start.format(“DD/MM/YYYY”),
start:start.format(“HH:mm”),
end:end.format(“HH:mm”),
道琼斯指数:[新日期(开始).getDay(),
范围:[{
开始:日期开始,
结束:空
}],
位置:positionEvent,
全天:错
});
长度++;
if(repeatingEvents[length-1].end==“00:00”){
repeatingEvents[length-1].end=“24:00”;
}
如果(全天){
repeatingEvents[length-1]。allDay=true;
repeatingEvents[length-1]。开始=null;
repeatingEvents[length-1]。end=null;
}
$(“#日历”)。完整日历(“参考事件”);
};
函数eventClick(事件、日期、jsEvent、视图){
isOpenDialog=true;
对于(var i=0;ifunction createCalendar() {
        vm.uiConfig = timeProfileFactory.getCalendarConfig();
        vm.uiConfig.calendar.eventClick = eventClick;
        vm.uiConfig.calendar.eventDrop = alertOnDrop;
        vm.uiConfig.calendar.eventResize = alertOnResize;
        vm.uiConfig.calendar.eventRender = eventRender;
        vm.uiConfig.calendar.select = selectSlot;
        vm.uiConfig.calendar.header.center = "title";

        vm.events = function(start, end, timezone, callback) {
            callback(repeatingEvents);
        }
        vm.eventSources = [vm.events];
    };

function selectSlot(start, end, jsEvent, view) {
        var allDay = !start.hasTime() && !end.hasTime();
        var offset = ((new Date()).getTimezoneOffset())/60;
        var dateStart = (new Date(start)).setHours(0, 0, 0, 0);      
        dateStart = new Date(dateStart);
        dateStart.setHours(dateStart.getHours() - offset);
        dateStart = dateStart.toISOString();

        var timeStart = (new Date(start)).toISOString();
        var timeEnd = (new Date(end)).toISOString();
        timeStart = timeStart.split('T')[0];
        timeEnd = timeEnd.split('T')[0];

        var length = repeatingEvents.length;
        if(positionEvent == -1 || repeatingEvents.length == 0) {
            positionEvent = 0;
        } else {
            positionEvent = repeatingEvents[length - 1].position + 1;
        }

        repeatingEvents.push({
            title: "From: " + start.format("DD/MM/YYYY"),
            start: start.format("HH:mm"),
            end: end.format("HH:mm"),
            dow: [new Date(start).getDay()],
            ranges: [{
                start: dateStart,
                end: null
            }],
            position: positionEvent,
            allDay: false
        });

        length++;
        if(repeatingEvents[length - 1].end == "00:00") {
            repeatingEvents[length - 1].end = "24:00";
        }
        if(allDay) {
            repeatingEvents[length - 1].allDay = true;
            repeatingEvents[length - 1].start = null;
            repeatingEvents[length - 1].end = null;
        }
        $("#calendar").fullCalendar("refetchEvents");
    };

function eventClick(event, date, jsEvent, view) {
        isOpenDialog = true;
        for(var i = 0; i < repeatingEvents.length; i++) {
            if(repeatingEvents[i].position == event.position && isOpenDialog) {
                selectIndex = i;
                vm.timeStart = repeatingEvents[i].start;
                vm.timeFinish = repeatingEvents[i].end;
                vm.dateStart = repeatingEvents[i].title.split(' ')[1];

                if(repeatingEvents[i].ranges[0].end == null) {
                    vm.dateFinish = "";
                    vm.radioValue = "never";
                } else {
                    vm.dateFinish = repeatingEvents[i].title.split(' ')[3];
                    vm.radioValue = "on";
                }

                angular.forEach(vm.checkDays, function(item) {
                    item.checked = false;
                });

                angular.forEach(event.dow, function(index) {
                    vm.checkDays[index].checked = true;
                })

                openDialog();    
                break;
            }
        }
    };

function alertOnResize(event, delta, revertFunc, jsEvent, ui, view) {
        for(var i in repeatingEvents) {
            if(repeatingEvents[i].position == event.position) {
                var timeFinish = event.end.format("HH:mm");
                if(timeFinish == "00:00") {
                    timeFinish = "24:00";
                }
                repeatingEvents[i].end = timeFinish;
                break;
            }
        }
        $("#calendar").fullCalendar("refetchEvents");
    };

function alertOnDrop(event, delta, revertFunc, jsEvent, ui, view) {
        for(var i in repeatingEvents) {
            if(repeatingEvents[i].position == event.position) {
                if(repeatingEvents[i].allDay || event.allDay) {
                    revertFunc();
                } else {
                    var timeStart = event.start.format("HH:mm");
                    var timeFinish = event.end.format("HH:mm");
                    var dateStart = repeatingEvents[i].ranges[0].start;
                    var dateFinish = repeatingEvents[i].ranges[0].end;
                    var oldTimeStart = repeatingEvents[i].start.split(':')[0]*3600 + repeatingEvents[i].start.split(':')[1]*60;
                    var newTimeStart = timeStart.split(':')[0]*3600 + timeStart.split(':')[1]*60;
                    var deltaHour = newTimeStart - oldTimeStart;
                    var deltaDay = (delta/1000 - deltaHour)/86400;
                    dateStart = new Date(dateStart);
                    dateStart.setDate(dateStart.getDate() + deltaDay);
                    dateStart = dateStart.toISOString();
                    var title;

                    if(dateFinish != null) {
                        dateFinish = new Date(dateFinish);
                        dateFinish.setDate(dateFinish.getDate() + deltaDay);
                        dateFinish = dateFinish.toISOString();
                        title = "From: " + moment(dateStart).format("DD/MM/YYYY") + " To: " + moment(dateFinish).format("DD/MM/YYYY");
                    } else {
                        title = "From: " + moment(dateStart).format("DD/MM/YYYY");
                    }

                    for(var j in event.dow) {
                        repeatingEvents[i].dow[j] = parseInt(repeatingEvents[i].dow[j]) + deltaDay;
                        if(repeatingEvents[i].dow[j] > 6) {
                            repeatingEvents[i].dow.splice(j, 1);
                        }
                    }

                    repeatingEvents[i].start = timeStart;
                    repeatingEvents[i].end = timeFinish;
                    repeatingEvents[i].ranges[0].start = dateStart;
                    repeatingEvents[i].ranges[0].end = dateFinish;
                    repeatingEvents[i].title = title;

                    if(timeFinish == "00:00") {
                        repeatingEvents[i].end = "24:00";
                    }
                    $("#calendar").fullCalendar("refetchEvents");
                }
                break;
            }
        }
    };

function eventRender(event, element, view) {
        var removeEvent = $("<i class='removeEvent icons8-delete pull-right'></i>");
        removeEvent.on("click", function() {
            isOpenDialog = false;
            vm.removeEvent(event);
        });
        element.find(".fc-content").prepend(removeEvent);

        var result;
        if(event.ranges[0].end == null) {
            result = (event.ranges.filter(function(range) {
                var startConvert = (new Date(event.start)).toISOString();
                return (event.start.isAfter(range.start) || startConvert == range.start);
            }).length) > 0;
        } else {
            result = (event.ranges.filter(function(range) {
                return (event.start.isBefore(range.end) && event.end.isAfter(range.start));
            }).length) > 0;
        }
        return result;
    };