import { Controller } from "@hotwired/stimulus"
|
|
import Sortable from 'sortablejs'
|
|
|
|
export default class extends Controller {
|
|
connect() {
|
|
this.sortable = new Sortable(this.element, {
|
|
onEnd: this.end.bind(this),
|
|
handle: '.handle'
|
|
})
|
|
|
|
}
|
|
|
|
disconnect() {
|
|
this.sortable.destroy()
|
|
}
|
|
|
|
end(event) {
|
|
|
|
// sortableUrl
|
|
if (this.element.dataset.sortableUrl != undefined) {
|
|
const item = this.element.children[event.newIndex]
|
|
const url = this.element.dataset.sortableUrl
|
|
const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content')
|
|
|
|
const formData = new FormData()
|
|
formData.append('id', item.dataset.id)
|
|
formData.append('new_index', event.newIndex)
|
|
// console.log("Move", event.oldIndex, "to", event.newIndex);
|
|
|
|
fetch(url, {
|
|
method: 'PATCH',
|
|
headers: {
|
|
'Accept': "text/vnd.turbo-stream.html",
|
|
'X-CSRF-Token': token
|
|
},
|
|
body: formData
|
|
})
|
|
.then (response => response.text())
|
|
.then(html => Turbo.renderStreamMessage(html))
|
|
.catch((err) => {
|
|
console.info('rejected', err)
|
|
})
|
|
} else {
|
|
this.element.querySelectorAll('input.position').forEach((input, index) => {
|
|
input.value = index + 1
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
}
|