My favorites | Sign in
Project Home Issues
New issue   Search
for
  Advanced search   Search tips   Subscriptions

Issue 550 attachment: fullcalendar_changes.txt (5.9 KB)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
In fullcalendar.js, this is my modified draggableSlotEvent function:

// when event starts out IN TIMESLOTS
function draggableSlotEvent(event, eventElement, timeElement) {
var origPosition;
var allDay=false;
var dayDelta;
var minuteDelta;
var prevMinuteDelta;
var dis = opt('isRTL') ? -1 : 1;
var hoverListener = getHoverListener();
var colCnt = getColCnt();
var colWidth = getColWidth();
var slotHeight = getSlotHeight();
eventElement.draggable({
appendTo:'body',
containment:'document',
zIndex: 9999,
scroll: false,
helper: 'clone',
//grid: [colWidth, slotHeight],
grid: [10 , slotHeight],
//axis: colCnt==1 ? 'y' : false,
axis:false,
opacity: opt('dragOpacity'),
revertDuration: opt('dragRevertDuration'),
start: function(ev, ui) {
trigger('eventDragStart', eventElement, event, ev, ui);
hideEvents(event, eventElement);
origPosition = eventElement.offset()
minuteDelta = prevMinuteDelta = 0;
hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
//eventElement.draggable('option', 'revert', !cell);
clearOverlays();
if (cell) {
dayDelta = colDelta * dis;
if (opt('allDaySlot') && !cell.row) {
// over full days
if (!allDay) {
// convert to temporary all-day event
allDay = true;
timeElement.hide();
eventElement.draggable('option', 'grid', null);
}
renderDayOverlay(
addDays(cloneDate(event.start), dayDelta),
addDays(exclEndDay(event), dayDelta)
);
}else{
// on slots
resetElement();
}
}
}, ev, 'drag');
},
drag: function(ev, ui) {
minuteDelta = Math.round((ui.offset.top - origPosition.top) / slotHeight) * opt('slotMinutes');
if (minuteDelta != prevMinuteDelta) {
if (!allDay) {
updateTimeText(minuteDelta);
}
prevMinuteDelta = minuteDelta;
}
},
stop: function(ev, ui) {
var cell = hoverListener.stop();
clearOverlays();
trigger('eventDragStop', eventElement, event, ev, ui);
//if (cell == null || (dayDelta || minuteDelta || allDay)) {
// changed!
eventDrop(this, event, dayDelta, allDay ? 0 : minuteDelta, allDay, ev, ui, cell);
/*}else{
// either no change or out-of-bounds (draggable has already reverted)
resetElement();
eventElement.css('filter', ''); // clear IE opacity side-effects
eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position
updateTimeText(0);
showEvents(event, eventElement);
}
*/
}
});
function updateTimeText(minuteDelta) {
var newStart = addMinutes(cloneDate(event.start), minuteDelta);
var newEnd;
if (event.end) {
newEnd = addMinutes(cloneDate(event.end), minuteDelta);
}
timeElement.text(formatDates(newStart, newEnd, opt('timeFormat')));
}
function resetElement() {
// convert back to original slot-event
if (allDay) {
timeElement.css('display', ''); // show() was causing display=inline
eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
allDay = false;
}
}
}

------------------------------------------------------------------------------

New eventDrop clause in calendar instantiation, 'cell' was added as a
function parameter in the code shown above:

eventDrop: function(event,dayDelta,minuteDelta,allDay,revertFunc,ev,ui,cell) {
if(null != cell)
{
/* put code here to handle changed event times */
}
else
{
var found_new = false;
// First make sure that the appointment hasn't been dropped outside the book
// -- #calwrap is a div that holds all the calendars
if(
$('#calwrap').offset().left <= ev.clientX
&& $('#calwrap').offset().left+$('#calwrap').width() >= ev.clientX
&& $('#calwrap').offset().top <= ev.clientY
&& $('#calwrap').offset().top+$('#calwrap').height() >= ev.clientY
)
{
ev.clientY += 10; // magic number kludge, cosmetic fixup, you may not need it

// Create an appointment in the moved-to calendar
// -- pjmcal class is a handy selector for all the fullcalendars on the page

$('.pjmcal').each(function(index){
if( $(this).offset().left <= ev.clientX
&& $(this).offset().left+$(this).width() >= ev.clientX
)
{
if( $(this).offset().top <= ev.clientY
&& $(this).offset().top+$(this).height() >= ev.clientY
)
{
found_new = true;
/* put code here to handle move to a new calendar */
}
}
})
}

if(!found_new)
{
// Not dropped on day forwarder
if (!confirm("Are you sure you want to remove this appointment?"))
{
return revertFunc();
}

$('#cal_'+event.staff).fullCalendar('removeEvents',event.id);

}
}
return null;
},





Powered by Google Project Hosting