Skip to content

Commit 38ff1a0

Browse files
committed
Handled some special cases where calendars 'overlap' - viewports are adjacent, but scrollable contents extend beneath adjacent viewports.
1 parent b56f51c commit 38ff1a0

File tree

2 files changed

+47
-51
lines changed

2 files changed

+47
-51
lines changed

js/rc_calendar.js

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,8 @@
1111
render_event : 'view_week_render_event',
1212
postcalrender : function(){},
1313

14-
get_time_offset : function( draggable, droppable, parent ){
15-
if( undefined != parent ) {
16-
return draggable.offset.top + parent.scrollTop() - droppable.offsetTop;
17-
} else {
18-
return draggable.offset.top - droppable.offsetTop;
19-
}
14+
get_time_offset : function( draggable, droppable ){
15+
return draggable.offset.top - droppable.offset().top;
2016
},
2117

2218
// persistent event storage accessor functions
@@ -155,8 +151,23 @@ function Calendar( element, options )
155151
$('.rc_day_target').droppable({
156152
drop: function( event, ui ) {
157153
var dragged = $(ui.draggable[0]);
158-
var target = $(event.target);
159-
var time_offset = t.options.get_time_offset( ui, event.target, $(event.target).parent() );
154+
155+
// event.target gets confused if the viewport is smaller than the droppable,
156+
// and the scrolled droppable 'virtually' overlaps another viewport containing
157+
// droppables. This function call ensures that the visible droppable is used
158+
var target_id = findDroppable( ui );
159+
160+
// the other half to this problem is that this function gets called twice,
161+
// once for the calendar that you dropped the event on, and once for the
162+
// "shadow" calendar hidden underneath it.
163+
164+
if( target_id != event.target.id ) {
165+
return; // oops... wrong one
166+
}
167+
168+
var target = $('#'+target_id);
169+
170+
var time_offset = t.options.get_time_offset( ui, target );
160171
var start_time = nearest_time( time_offset );
161172
var date = new moment( parseInt(target.attr('data-date'),10) );
162173
var resource_id = target.parent().attr('id');
@@ -266,22 +277,14 @@ function Calendar( element, options )
266277
helper : 'clone',
267278
zIndex : 9999,
268279
drag : function( event, ui ){
269-
// [TODO]
270-
// Update Time in helper during drag
271-
// Add "next week, previous week" drag zones?
272-
//
280+
273281
var target = findDroppable( ui );
274282

275283
if( target ){
276284
var tgtdiv = $('#'+target);
277-
// make compatible with 'drop' parameters
278-
tgtdiv.offsetTop = tgtdiv.offset().top;
279-
tgtdiv.offsetLeft = tgtdiv.offset().left;
280285
var time_offset = t.options.get_time_offset( ui, tgtdiv );
281286
var start_time = nearest_time( time_offset );
282287
ui.helper.find(".rc_event_head").text(start_time);
283-
284-
console.log( start_time );
285288
}
286289

287290
}
@@ -358,7 +361,34 @@ function Calendar( element, options )
358361
return valid_resources;
359362
}
360363

364+
//
365+
// findDroppable
366+
// =============
367+
// Called during dragging and on drop, this function returns the id of a div beneath
368+
// the draggable object, if that div is visible and a droppable target.
369+
//
370+
function findDroppable( ui )
371+
{
372+
retval = false;
373+
374+
// [TODO] should cache this selection...
375+
$('.ui-droppable').each(function(){
361376

377+
var parent = $(this).parent();
378+
var viewableTop = parent.position().top;
379+
var viewableBottom = viewableTop + parent.height();
380+
var pos = ui.position;
381+
382+
if( pos.top > viewableTop &&
383+
pos.top < viewableBottom &&
384+
(pos.left + 20) > $(this).position().left &&
385+
pos.left < $(this).position().left + $(this).width() ){
386+
return retval = $(this).attr('id');
387+
}
388+
})
389+
390+
return retval;
391+
}
362392

363393
function display_week( date, resource )
364394
// date : epoch milliseconds
@@ -452,7 +482,6 @@ function rc_EventManager( retrieve_events, save_event, delete_event, resources,
452482
var render = display;
453483
var persistEvent= save_event;
454484
var killEvent = delete_event;
455-
var to_write = []; // [NOTE] - this may disappear, it is for async writes to a server
456485
var t = this;
457486

458487
t.Events = retrieve_events();
@@ -474,7 +503,6 @@ function rc_EventManager( retrieve_events, save_event, delete_event, resources,
474503
var id = new_event.attr.id;
475504

476505
t.Events[ id ] = new_event;
477-
to_write[id] = true;
478506

479507
if( resource.addEvent( new_event ) ) {
480508
new_event.attr.resource = resource.id;
@@ -487,7 +515,6 @@ function rc_EventManager( retrieve_events, save_event, delete_event, resources,
487515
}
488516

489517
t.moveEvent = function( evt, parent, old_resource, new_resource, options ) {
490-
to_write[evt.attr.id] = true;
491518

492519
// have to update event attributes before attempting to move the event,
493520
// but have to be prepared to revert them if the new resource rejects the event

js/rc_utilities.js

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -265,37 +265,6 @@ function confirm(message, callback, param) {
265265
}
266266

267267

268-
//
269-
// findDroppable
270-
// =============
271-
// Called during dragging, this function returns the id of a div beneath the draggable
272-
// object, if that div is a droppable target.
273-
//
274-
275-
function findDroppable( ui )
276-
{
277-
retval = false;
278-
279-
// should cache this selection...
280-
$('.ui-droppable').each(function(){
281-
282-
var parent = $(this).parent();
283-
var viewableTop = parent.position().top;
284-
var viewableBottom = viewableTop + parent.height();
285-
var pos = ui.position;
286-
287-
if( pos.top > viewableTop &&
288-
pos.top < viewableBottom &&
289-
pos.left > $(this).position().left &&
290-
pos.left < $(this).position().left + $(this).width() ){
291-
return retval = $(this).attr('id');
292-
}
293-
})
294-
295-
return retval;
296-
}
297-
298-
299268
//
300269
// insert_shuffle_meeting
301270
// ======================

0 commit comments

Comments
 (0)