我使用fullcalendar创建一个日历,用户可以在其中指示他的职责。我已经设置了日历,所以有allDaySlots可用。它们在日历上显示正确,但我无法选择它们。在select回调中有什么特别要指定的吗?
是否也可以设置fullcalendar,以便当用户选择allDaySlot时,有关当天的整行显示为所选?
$(document).ready(function() {
// page is now ready, initialize the calendar...
var array_dispo = [];
$('#calendar').fullCalendar({
defaultView: 'agendaWeek',
lang: "fr",
header: false,
timezone: 'local',
minTime: "08:00:00",
columnFormat: 'dddd',
selectHelper: true,
selectable: true,
allDaySlot: true,
select: function(start, end, allDay) {
var eventData = {
// allDay: allDay,
start: start,
end: end,
block: true,
editable: true,
backgroundColor: "#469278"
};
var mEnd = $.fullCalendar.moment(end);
var mStart = $.fullCalendar.moment(start);
if (mEnd.isAfter(mStart, 'day')) {
$('#calendar').fullCalendar('unselect');
} else {
$('#calendar').fullCalendar('renderEvent', eventData, true); // stick? = true
console.log(eventData);
var array_all_events = [];
var all_events = $('#calendar').fullCalendar('clientEvents');
$.each(all_events, function(index, value) {
var day = moment(value.start["_d"]).format('dddd');
var start_time = moment(value.start["_d"]).format("HH:mm");
var end_time = moment(value.end["_d"]).format("HH:mm");
var slot = {
day: day,
start_time: start_time,
end_time: end_time,
};
array_all_events.push(slot);
$("#dispo_array").val(JSON.stringify(array_all_events));
});
$('#calendar').fullCalendar('unselect');
}
},
eventClick: function(event, element) {
if(confirm('Voulez-vous supprimer cette dispo?')) {
$('#calendar').fullCalendar('removeEvents', event._id);
var array_all_events = [];
var all_events = $('#calendar').fullCalendar('clientEvents');
// console.log(all_events);
$.each(all_events, function(index, value) {
// console.log(value.start["_d"]);
// console.log(index);
var day = moment(value.start["_d"]).format('dddd');
var start_time = moment(value.start["_d"]).format("HH:mm");
var end_time = moment(value.end["_d"]).format("HH:mm");
// var id = value.unique_id["_i"];
var slot = {
day: day,
start_time: start_time,
end_time: end_time,
};
array_all_events.push(slot);
console.log(array_all_events.length);
if (array_all_events.length == 0) {
$("#dispo_array").val("");
}
else {
$("#dispo_array").val(JSON.stringify(array_all_events));
}
});
}
},
eventDragStop: function( event, jsEvent, ui, view ) {
// console.log(event);
var all_events = $('#calendar').fullCalendar('clientEvents');
},
selectOverlap: function(event) {
return ! event.block;
}
});
});
我在这里做了一个jsfield
这里的代码片段:
...
var mEnd = $.fullCalendar.moment(end);
var mStart = $.fullCalendar.moment(start);
if (mEnd.isAfter(mStart, 'day')) {
$('#calendar').fullCalendar('unselect');
} else {
...
导致全天事件立即取消选择,因为条件mEnd > mStart
对于这些事件总是为真。
如果改成
...
var mEnd = $.fullCalendar.moment(end);
var mStart = $.fullCalendar.moment(start);
// just uncommented this:
/*if (mEnd.isAfter(mStart, 'day')) {
$('#calendar').fullCalendar('unselect');
} else*/
{
$('#calendar').fullCalendar('renderEvent', eventData, true); // stick? = true
...
全天事件被正确呈现。title
是强制性的,所以我添加了这个。
另一种方法是将默认事件持续时间设置为0
,但我还没有测试过,见这里http://fullcalendar.io/docs/event_data/defaultAllDayEventDuration/
编辑
看看这个小提琴:http://jsfiddle.net/xaLzo7g6/3/
多个方面:
- 时刻事件是可变的,因此在修改它们之前需要克隆
- 时区被设置为"本地",而时刻是UTC,这导致所有事件发生2小时的转移到第二天。将其设置为"UTC"可以将重叠设置为第二天
- 取消选择的逻辑被完全移除,因为它是不必要的
从我的角度来看,它现在表现得像我想要的那样:点击全天插槽或选择任何时间框架总是"选择"全天并阻止它