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
0 commit comments