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