igGridではドラッグ&ドロップ操作によって行の入れ替えを行うAPIは実装されていないのですが、jQueryのSortable機能を使用して同等の動作を実現することができます。
以下のようにigGridのrowsRenderedイベントでigGridのtbody要素に対してSortableを初期化し、stopイベントでigGridのデータソースに対して行の入れ替えを行います。
$("#grid1").igGrid({
.....
rowsRendered: function(evt, ui) {
//igGridのtbody要素に対してSortableを設定する
$( "#grid1 tbody" ).sortable({
containment: "parent",
start: function(evt, ui) {
var children = ui.item.children();
$("#grid1_headers thead th").each(function(ix, el) {
//td要素の幅をヘッダーの幅と同じになるよう設定する
$(children[ix]).width($(el).width());
});
},
stop: function(evt, ui){
var ds = $("#grid1").data('igGrid').dataSource,
rowId = parseInt(ui.item.attr('data-id')),
newDs = $.extend([], ds.settings.dataSource),
record = $.extend({}, ds.findRecordByKey(rowId)),
scrollPos = $("#grid1_scroll").scrollTop(),
recordIndex;
recordIndex = ds.settings.dataSource.map(function(e){
return e.ProductID
}).indexOf(rowId);
//移動した行を削除する
newDs.splice(recordIndex, 1);
recordIndex = $("#grid1").igGrid('allRows').index($('tr[data-id = "' + rowId + '"]'));
//移動した行を追加し直す
newDs.splice(recordIndex, 0, record);
//igGridのdataSourceを置き換える
$("#grid1").igGrid('option', 'dataSource', newDs);
//スクロール位置を元に戻す
$("#grid1_scroll").scrollTop(scrollPos);
}
});
}
});
