$.ui.plugin.add( "draggable", "connectToSortableFixed", {
start: function( event, ui, draggable ) {
var uiSortable = $.extend( {}, ui, {
draggable._parent = this.parent();
draggable.sortables = [];
$( draggable.options.connectToSortableFixed ).each(function() {
var sortable = $( this ).sortable( "instance" );
if ( sortable && !sortable.options.disabled ) {
draggable.sortables.push( sortable );
sortable.refreshPositions();
sortable._trigger("activate", event, uiSortable);
stop: function( event, ui, draggable ) {
var uiSortable = $.extend( {}, ui, {
draggable.cancelHelperRemoval = false;
$.each( draggable.sortables, function() {
draggable.cancelHelperRemoval = true;
sortable.cancelHelperRemoval = false;
position: sortable.placeholder.css( "position" ),
top: sortable.placeholder.css( "top" ),
left: sortable.placeholder.css( "left" )
sortable._mouseStop(event);
sortable.options.helper = sortable.options._helper;
sortable.cancelHelperRemoval = true;
sortable._trigger( "deactivate", event, uiSortable );
drag: function( event, ui, draggable ) {
$.each( draggable.sortables, function() {
var innermostIntersecting = false,
sortable.positionAbs = draggable.positionAbs;
sortable.helperProportions = draggable.helperProportions;
sortable.offset.click = draggable.offset.click;
if ( sortable._intersectsWith( sortable.containerCache ) ) {
innermostIntersecting = true;
$.each( draggable.sortables, function() {
this.positionAbs = draggable.positionAbs;
this.helperProportions = draggable.helperProportions;
if ( this !== sortable &&
this._intersectsWith( this.containerCache ) &&
$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
innermostIntersecting = false;
return innermostIntersecting;
if ( innermostIntersecting ) {
if ( !sortable.isOver ) {
sortable.currentItem = ui.helper
.appendTo( sortable.element )
.data( "ui-sortable-item", true );
sortable.options._helper = sortable.options.helper;
sortable.options.helper = function() {
event.target = sortable.currentItem[ 0 ];
sortable._mouseCapture( event, true );
sortable._mouseStart( event, true, true );
sortable.offset.click.top = draggable.offset.click.top;
sortable.offset.click.left = draggable.offset.click.left;
sortable.offset.parent.left -= draggable.offset.parent.left -
sortable.offset.parent.left;
sortable.offset.parent.top -= draggable.offset.parent.top -
sortable.offset.parent.top;
draggable._trigger( "toSortable", event );
draggable.dropped = sortable.element;
$.each( draggable.sortables, function() {
draggable.currentItem = draggable.element;
sortable.fromOutside = draggable;
if ( sortable.currentItem ) {
sortable._mouseDrag( event );
ui.position = sortable.position;
sortable.cancelHelperRemoval = true;
sortable.options._revert = sortable.options.revert;
sortable.options.revert = false;
sortable._trigger( "out", event, sortable._uiHash( sortable ) );
sortable._mouseStop( event, true );
sortable.options.revert = sortable.options._revert;
sortable.options.helper = sortable.options._helper;
ui.helper.appendTo( draggable._parent );
console.log(this.offset.click)
draggable._refreshOffsetsSortable( event, this );
ui.position = draggable._generatePosition( event, true );
if ( sortable.placeholder ) {
sortable.placeholder.remove();
draggable._trigger( "fromSortable", event );
draggable.dropped = false;
$.each( draggable.sortables, function() {
$.ui.draggable.prototype._refreshOffsetsSortable = function(event, draggable){
top: this.positionAbs.top - this.margins.top,
left: this.positionAbs.left - this.margins.left,
parent: this._getParentOffset(),
relative: this._getRelativeOffset()
this.offset.click = draggable.offset.click;
$('.sortable').sortable({
connectWith: '.sortable',
forcePlaceholderSize: true,
placeholder: 'ui-sortable-placeholder',
receive: function (e, ui) {
$('.draggable').draggable({
connectToSortableFixed: '.sortable',