ジンジャー研究室

長めのつぶやき。難しいことは書きません。

jQueryでグループの仕切りをドラッグする

jQuery UI Sortable (+ Something)

ついかっとなってやった。

f:id:jinjor:20130718035513p:plain

順番の固定されているグループと、これまた順番の固定されているアイテムに対して「ここからここまでがこのグループなんじゃー」という風に指定するUIを書いてみた。
ドラッグできるのはグループ名のみ。グループの順番を変えられないようにしているのがポイント。
(コピペで動くように下のでスタイルシートがうるさいのは勘弁してください)

<html>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <head>
        <script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
        <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>
        <style>
        <!--
        ul {
            list-style:none;
            width:200px;
            padding-left:0px;
        }
        li {
            width:200px;
            background-color:#ddd;
        }
        li.item{
            border-top: solid 1px #ccc;
        }
        li.item:hover {
            background-color:#e6e6e6;
        }
        li.item.not_droppable {
            background-color:#bbb;
            border-top: solid 1px #aaa;
        }
        li.group {
            background-color:#6a9;
            border-top-left-radius:5px;
            border-top-right-radius:5px;
        }
        li.group:hover {
            background-color:#7ba;
        }
        li.group:not(:first-child) {
            cursor:move;
        }
        li.group.not_droppable {
            background-color:#486;
        }
        -->  
        </style>
        <script>
            $(function(){
                $('.container').sortable({
                    cancel: '.item,.group:first-child',
                    items: 'li:not(.not_droppable)',
                    stop: function( event, ui ) {
                        //TODO change 'name' attributes
                    }
                }).children('li.group:not(:first-child)').mousedown(function(){
                    var $item = $(this);
                    $item.nextAll('.group').first().addClass('not_droppable').nextAll().addClass('not_droppable');
                    $item.prevAll('.group').first().addClass('not_droppable').prevAll().addClass('not_droppable');
                }).mouseup(function(){
                    $(this).siblings().removeClass('not_droppable');
                });
                
            });
        </script>
    </head>
    <body>
        <ul class="container">
            <li class="group">G1</li>
            <li class="item">i1</li>
            <li class="item">i2</li>
            <li class="item">i3</li>
            <li class="group">G2</li>
            <li class="item">i4</li>
            <li class="group">G3</li>
            <li class="item">i5</li>
            <li class="item">i6</li>
            <li class="group">G4</li>
        </ul>
    </body>
</html>

もっと簡単に出来るかもしれないけど、もう力尽きた。
(5分後追記)もっと簡単に出来た。
(15分後追記)もっと簡単に出来た。