このサンプルでは、Sortable javascriptライブラリをhtmxを使用して統合する方法を示します。
まず、Sortable
javascriptライブラリを使用して.sortable
クラスを初期化します。
htmx.onLoad(function(content) {
var sortables = content.querySelectorAll(".sortable");
for (var i = 0; i < sortables.length; i++) {
var sortable = sortables[i];
var sortableInstance = new Sortable(sortable, {
animation: 150,
ghostClass: 'blue-background-class',
// Make the `.htmx-indicator` unsortable
filter: ".htmx-indicator",
onMove: function (evt) {
return evt.related.className.indexOf('htmx-indicator') === -1;
},
// Disable sorting on the `end` event
onEnd: function (evt) {
this.option("disabled", true);
}
});
// Re-enable sorting on the `htmx:afterSwap` event
sortable.addEventListener("htmx:afterSwap", function() {
sortableInstance.option("disabled", false);
});
}
})
次に、その中に並べ替え可能なdivを含むフォームを作成し、Sortable.jsが起動するend
イベントでajaxリクエストをトリガーします。
<form class="sortable" hx-post="/items" hx-trigger="end">
<div class="htmx-indicator">Updating...</div>
<div><input type='hidden' name='item' value='1'/>Item 1</div>
<div><input type='hidden' name='item' value='2'/>Item 2</div>
<div><input type='hidden' name='item' value='3'/>Item 3</div>
<div><input type='hidden' name='item' value='4'/>Item 4</div>
<div><input type='hidden' name='item' value='5'/>Item 5</div>
</form>
各divの中にその行のアイテムIDを指定する非表示の入力を含みます。
Sortable.jsのドラッグアンドドロップでリストが並べ替えられると、end
イベントが起動します。htmxはアイテムIDを新しい順序で/items
に投稿し、サーバーによって永続化されます。
以上です!