Updated shelf-sort to use sortablejs
This commit is contained in:
parent
f12a7540c9
commit
2eba8c611e
5 changed files with 35 additions and 37 deletions
7
package-lock.json
generated
7
package-lock.json
generated
|
@ -6264,6 +6264,13 @@
|
|||
"integrity": "sha512-UDp0epjaZikuInoJA9rlEIJaSTQThabq0R9x7TqBdl0qGVFKKzo6glP6ubfzWBmV4iRIfbSOs2DV06s3B5h5tA==",
|
||||
"requires": {
|
||||
"sortablejs": "^1.9.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"sortablejs": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.9.0.tgz",
|
||||
"integrity": "sha512-Ot6bYJ6PoqPmpsqQYXjn1+RKrY2NWQvQt/o4jfd/UYwVWndyO5EPO8YHbnm5HIykf8ENsm4JUrdAvolPT86yYA=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"watchpack": {
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
"jquery-sortable": "^0.9.13",
|
||||
"markdown-it": "^8.4.2",
|
||||
"markdown-it-task-lists": "^2.1.1",
|
||||
"sortablejs": "^1.9.0",
|
||||
"vue": "^2.6.10",
|
||||
"vuedraggable": "^2.21.0"
|
||||
},
|
||||
|
|
|
@ -1,25 +1,26 @@
|
|||
import "jquery-sortable";
|
||||
import Sortable from "sortablejs";
|
||||
|
||||
class ShelfSort {
|
||||
|
||||
constructor(elem) {
|
||||
this.elem = elem;
|
||||
this.sortGroup = this.initSortable();
|
||||
this.input = document.getElementById('books-input');
|
||||
this.shelfBooksList = elem.querySelector('[shelf-sort-assigned-books]');
|
||||
|
||||
this.initSortable();
|
||||
this.setupListeners();
|
||||
}
|
||||
|
||||
initSortable() {
|
||||
const placeHolderContent = this.getPlaceholderHTML();
|
||||
// TODO - Load sortable at this point
|
||||
return $('.scroll-box').sortable({
|
||||
group: 'shelf-books',
|
||||
exclude: '.instruction,.scroll-box-placeholder',
|
||||
containerSelector: 'div.scroll-box',
|
||||
itemSelector: '.scroll-box-item',
|
||||
placeholder: placeHolderContent,
|
||||
onDrop: this.onDrop.bind(this)
|
||||
});
|
||||
const scrollBoxes = this.elem.querySelectorAll('.scroll-box');
|
||||
for (let scrollBox of scrollBoxes) {
|
||||
new Sortable(scrollBox, {
|
||||
group: 'shelf-books',
|
||||
ghostClass: 'primary-background-light',
|
||||
animation: 150,
|
||||
onSort: this.onChange.bind(this),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
setupListeners() {
|
||||
|
@ -45,27 +46,11 @@ class ShelfSort {
|
|||
this.onChange();
|
||||
}
|
||||
|
||||
onDrop($item, container, _super) {
|
||||
this.onChange();
|
||||
_super($item, container);
|
||||
}
|
||||
|
||||
onChange() {
|
||||
const data = this.sortGroup.sortable('serialize').get();
|
||||
this.input.value = data[0].map(item => item.id).join(',');
|
||||
const instruction = this.elem.querySelector('.scroll-box-item.instruction');
|
||||
instruction.parentNode.insertBefore(instruction, instruction.parentNode.children[0]);
|
||||
const shelfBookElems = Array.from(this.shelfBooksList.querySelectorAll('[data-id]'));
|
||||
this.input.value = shelfBookElems.map(elem => elem.getAttribute('data-id')).join(',');
|
||||
}
|
||||
|
||||
getPlaceholderHTML() {
|
||||
const placeHolder = document.querySelector('.scroll-box-placeholder');
|
||||
placeHolder.style.display = 'block';
|
||||
const placeHolderContent = placeHolder.outerHTML;
|
||||
placeHolder.style.display = 'none';
|
||||
return placeHolderContent;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
export default ShelfSort;
|
|
@ -216,12 +216,23 @@ $btt-size: 40px;
|
|||
.scroll-box-item {
|
||||
padding: $-xs $-m;
|
||||
border-bottom: 1px solid #DDD;
|
||||
border-top: 1px solid #DDD;
|
||||
margin-top: -1px;
|
||||
&:last-child {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.scroll-box[data-instruction]:before {
|
||||
content: attr(data-instruction);
|
||||
padding: $-xs $-m;
|
||||
border-bottom: 1px solid #DDD;
|
||||
display: block;
|
||||
font-size: 0.75rem;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.fullscreen {
|
||||
border:0;
|
||||
position:fixed;
|
||||
|
|
|
@ -15,13 +15,7 @@
|
|||
<label for="books">{{ trans('entities.shelves_books') }}</label>
|
||||
<input type="hidden" id="books-input" name="books"
|
||||
value="{{ isset($shelf) ? $shelf->books->implode('id', ',') : '' }}">
|
||||
<div class="scroll-box">
|
||||
<div class="scroll-box-item text-small text-muted instruction">
|
||||
{{ trans('entities.shelves_drag_books') }}
|
||||
</div>
|
||||
<div class="scroll-box-item scroll-box-placeholder" style="display: none;">
|
||||
<a href="#" class="text-muted">@icon('book') ...</a>
|
||||
</div>
|
||||
<div class="scroll-box" shelf-sort-assigned-books data-instruction="{{ trans('entities.shelves_drag_books') }}">
|
||||
@if (isset($shelfBooks) && count($shelfBooks) > 0)
|
||||
@foreach ($shelfBooks as $book)
|
||||
<div data-id="{{ $book->id }}" class="scroll-box-item">
|
||||
|
|
Loading…
Reference in a new issue