mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-05-16 21:34:58 +00:00
Improved shelf book management interface
- Added ability to search books list (Local simple text match). - Added handles, hover-states and cursor states for better user interaction and clearer use of drag & drop. - Improved styles for dark mode. - Converted shelf sort component to newer component format. - Modernized shelf controller code a little. Related to #3266
This commit is contained in:
parent
975ba4f8d8
commit
b0adb74d62
6 changed files with 102 additions and 48 deletions
resources/js/components
|
@ -2,10 +2,12 @@ import Sortable from "sortablejs";
|
|||
|
||||
class ShelfSort {
|
||||
|
||||
constructor(elem) {
|
||||
this.elem = elem;
|
||||
this.input = document.getElementById('books-input');
|
||||
this.shelfBooksList = elem.querySelector('[shelf-sort-assigned-books]');
|
||||
setup() {
|
||||
this.elem = this.$el;
|
||||
this.input = this.$refs.input;
|
||||
this.shelfBookList = this.$refs.shelfBookList;
|
||||
this.allBookList = this.$refs.allBookList;
|
||||
this.bookSearchInput = this.$refs.bookSearch;
|
||||
|
||||
this.initSortable();
|
||||
this.setupListeners();
|
||||
|
@ -25,12 +27,36 @@ class ShelfSort {
|
|||
|
||||
setupListeners() {
|
||||
this.elem.addEventListener('click', event => {
|
||||
const sortItem = event.target.closest('.scroll-box-item:not(.instruction)');
|
||||
const sortItem = event.target.closest('.scroll-box-item');
|
||||
if (sortItem) {
|
||||
event.preventDefault();
|
||||
this.sortItemClick(sortItem);
|
||||
}
|
||||
});
|
||||
|
||||
this.bookSearchInput.addEventListener('input', event => {
|
||||
this.filterBooksByName(this.bookSearchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {String} filterVal
|
||||
*/
|
||||
filterBooksByName(filterVal) {
|
||||
|
||||
// Set height on first search, if not already set, to prevent the distraction
|
||||
// of the list height jumping around
|
||||
if (!this.allBookList.style.height) {
|
||||
this.allBookList.style.height = this.allBookList.getBoundingClientRect().height + 'px';
|
||||
}
|
||||
|
||||
const books = this.allBookList.children;
|
||||
const lowerFilter = filterVal.trim().toLowerCase();
|
||||
|
||||
for (const bookEl of books) {
|
||||
const show = !filterVal || bookEl.textContent.toLowerCase().includes(lowerFilter);
|
||||
bookEl.style.display = show ? null : 'none';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -47,7 +73,7 @@ class ShelfSort {
|
|||
}
|
||||
|
||||
onChange() {
|
||||
const shelfBookElems = Array.from(this.shelfBooksList.querySelectorAll('[data-id]'));
|
||||
const shelfBookElems = Array.from(this.shelfBookList.querySelectorAll('[data-id]'));
|
||||
this.input.value = shelfBookElems.map(elem => elem.getAttribute('data-id')).join(',');
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue