Tento plugin pro javascriptovou knihovnu jQuery umožňuje snadnou manipulaci s řádky v tabulce.
Do administrace jednoho webu jsem potřeboval doplnit funkci, pomocí které bude možné určovat pořadí zobrazování položek. Hledal jsem řešení, které by umožnilo uživateli pohodlné a rychlé přesouvání jednotlivých záznamů. Našel jsem plugin Table Drag and Drop pro známou javascriptovou knihovnu jQuery.
Pro použití je do dokumentu nutno vložit link na knihovnu jQuery a zároveň i na tento plugin. Potom stačí pomocí jQuery selektorů zvolit tabulku a zavolat funkci tableDnd().
Příklady použití
Velice jednoduchý příklad, pomocí kterého můžeme vytvořit tabulku, jejíž řádky lze přesouvat myší. HTML kód není ničím zvláštní:
<table id="table1" cellspacing="0" cellpadding="2">
<tr id="1"><td>1</td><td>Jedna</td><td>text</td></tr>
<tr id="2"><td>2</td><td>Dvě</td><td>text</td></tr>
<tr id="3"><td>3</td><td>Tři</td><td>text</td></tr>
<tr id="4"><td>4</td><td>Čtyři</td><td>text</td></tr>
<tr id="5"><td>5</td><td>Pět</td><td>text</td></tr>
<tr id="6"><td>6</td><td>Šest</td><td>text</td></tr>
</table>
Pro přidání možnosti přesunu řádků stačí vložit následujících pár řádků JavaScriptu:
<script type="text/javascript">
$(document).ready(function() {
// Inicializace tabulky
$("#table1").tableDnD();
});
</script>
Příklad si můžete vyzkoušet zde.
Předchozí příklad využíval defaultní nastavení, ale v případě potřeby můžeme libovolně nastavovat mnoho parametrů, které určují vzhled a chování tabulky, a také můžeme specifikovat chování objektu při zachycení a pohybu.
- onDragStyle
- Definuje styl, který získá řádek buňky během pohybu. Samozřejmě lze použít pouze parametry aplikovatelné na řádek tabulky.
- onDropStyle
- Definuje styl, který získá řádek buňky po přesunu.
- onDragClass
- Tato třída je s řádkem asociována během přesunu a po jeho uvolnění je asociace odstraněna. Defaultní třída je tDnD_whileDrag, její nastavení lze jednoduše změnit ve stylopisu.
- onDrop
- Definuje funkci, která je zavolána po zachycení řádku. Funkce má dva parametry: tabulku a řádek, který uživatel zachytil. Nové pořadí řádků lze zjistit pomocí table.tBodies[0].rows.
- onDragStart
- Definuje funkci, která je zavolána v okamžiku, kdy uživatel začne řádkem pohybovat. Funkce má dva parametry: tabulku a řádek, který uživatel přesouvá.
- scrollAmount
- Počet pixelů, o které se tabulka pohne, když uživatel dosáhne horního nebo spodního okraje okna. Stránka by se měla pohybovat automaticky.
Druhý příklad demonstruje použití onDrop i onDragClass.
$(document).ready(function() {
// Sudé řádky budou mít jinou barvu.
$("#table2 tr:even').addClass('alt')");
// Inicializace druhé tabulky, přiřazení dragClass a onDrop funkce.
$("#table2").tableDnD({
onDragClass: "myDragClass",
onDrop: function(table, row) {
var rows = table.tBodies[0].rows;
var debugStr = "Byl přesunut řádek: "+row.id+". Nové pořadí je: ";
for (var i=0; i<rows.length; i++) {
debugStr += rows[i].id+" ";
}
$(#debugArea).html(debugStr);
},
onDragStart: function(table, row) {
$(#debugArea).html("Začínám posunovat řádkem: "+row.id);
}
});
});
Příklad si můžete vyzkoušet zde.
Často je potřeba odeslat informaci o přesunu řádků na server. K tomu slouží funkce serialize(), která nemá žádné parametry, ale dokáže určit id tabulky z kontextu. Výstupem je řetězec ve tvaru tableId[]=rowId1&tableId[]=rowId2&tableId[]=rowId3.... Jednoduchý příklad použití demonstruje následující kód:
$('#table-3').tableDnD({
onDrop: function(table, row) {
alert($.tableDnD.serialize());
}
});
Tento příklad také ukazuje, jak vybrané řádky chránit proti přesunu nebo zamezit uvolnění přesunovaného řádku nad vybranými řádky tabulky. Pokud řádku nastavíme třídu nodrag, nebude možné jej uchopit ani přesunout. Třída nodrop zabrání uvolnění přesunovaného objektu nad zvoleným řádkem.
Příklad si můžete vyzkoušet zde.
Pomocí funkce hover z knihovny jQuery můžeme zobrazit šipky, a zdůraznit tak možnost přesunu řádků.
$("#table4 tr").hover(function() {
$(this.cells[0]).addClass('showDragHandle');
}, function() {
$(this.cells[0]).removeClass('showDragHandle');
});
Příklad si můžete vyzkoušet zde.
Problémy nastávají u tabulek, které mají více částí uzavřených do tagu TBODY. Knihovna zatím umožňuje přesun pouze v rámci daného TBODY.