diff --git a/package-lock.json b/package-lock.json index 5ad14fcf0..eab4ce9b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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": { diff --git a/package.json b/package.json index 5b175f49c..fb06afc83 100644 --- a/package.json +++ b/package.json @@ -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" }, diff --git a/resources/assets/js/components/shelf-sort.js b/resources/assets/js/components/shelf-sort.js index 86fb5e143..38e8ae8d3 100644 --- a/resources/assets/js/components/shelf-sort.js +++ b/resources/assets/js/components/shelf-sort.js @@ -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; \ No newline at end of file diff --git a/resources/assets/sass/styles.scss b/resources/assets/sass/styles.scss index 3fbbcf1da..70f04f3ff 100644 --- a/resources/assets/sass/styles.scss +++ b/resources/assets/sass/styles.scss @@ -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; diff --git a/resources/views/shelves/form.blade.php b/resources/views/shelves/form.blade.php index 4191f421d..5803275df 100644 --- a/resources/views/shelves/form.blade.php +++ b/resources/views/shelves/form.blade.php @@ -15,13 +15,7 @@ -