DND - FORCE SCROLL - #2

This is a simple Twitter Bootstrap 3 template. You can fork it to get a ready to use Bootstrap 3 fiddle.

by bizamajig

HTML

<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<div class="phase-scroll">
    <ul class="phases row">
    </ul>
</div>

CSS

/* Latest compiled and minified CSS included as External Resource*/

/* Optional theme */
@import url('//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-theme.min.css');

body {
    margin: 10px;
}

.phase-scroll {
    width: 100%;
    xoverflow: auto;
}

h2 {
    cursor: move;
    background: #ccc;
    margin: 0;
    padding: 5px;
}

.phases {
    white-space: nowrap;
}

.phase {
    display: inline-block;
    vertical-align: top;
    width: 120px;
    margin: 0 10px;
    border: 1px solid #222;
}

.phase-block {
    max-height: 300px;
    overflow: auto;    
}

.item {
    border: 1px solid #ccc;
    padding: 5px;
}

JavaScript

/* Latest compiled and minified JavaScript included as External Resource */
jQuery(function($){
    var keepScrolling = false;
    var $phases = $('.phases');
    for (var i=0; i<10; i++) {
        var $phase = $('<li />').addClass('phase').append('<h2>+</h2>');
        var $block = $('<div/>').addClass('phase-block');
        
        for (var j=0; j< 20; j++) {
            var $item = $('<div/>').text(i+'_Item' + j).addClass('item');
            $block.append($item);
        }
        
        $phase.append($block);
        $phases.append($phase);
    }
    
    $('.phases').sortable({
        handle: 'h2',
        scroll: true
    });
    
    $('.phase-block').sortable({
        scroll: true,
        connectWith: '.phase-block',
        appendTo: '.phase-scroll',
        sort: function( event, ui ) {
              if(ui.offset.top >= $(this).height()-ui.item.height()/2){
                keepScrolling = true;
                upDown = 1;
            }
            else if(ui.offset.top <= ui.item.height()){
                keepScrolling = true;
                upDown = -1;
            }
            else 
                keepScrolling = false;  
            }
    });
    
    $(".phase-block").scroll(function() {
        clearTimeout($.data(this, 'scrollTimer'));
        $.data(this, 'scrollTimer', setTimeout(function() {
            if(keepScrolling)
               $("#sortable").scrollTop($("#sortable").scrollTop()+80*upDown);
        }, 150));
    });
    
});