diff --git a/client/components/Search/Search.vue b/client/components/Search/Search.vue index be49bec..fd41915 100644 --- a/client/components/Search/Search.vue +++ b/client/components/Search/Search.vue @@ -179,32 +179,44 @@ -
+
- +
-
+
+ + + Показать еще {{ showMoreCount }} + + + Показать все + +
+ +
Только найденные книги
-
+
Все книги серии
@@ -774,11 +786,11 @@ class Search { if (!this.showCounts || item.count === undefined) return result; - if (item.loadedBooks) { + if (item.booksLoaded) { let count = 0; - for (const book of item.loadedBooks) { + for (const book of item.booksLoaded) { if (book.type == 'series') - count += book.books.length; + count += book.seriesBooks.length; else count++; } @@ -897,12 +909,12 @@ class Search { return this.expandedSeries.indexOf(seriesItem.key) >= 0; } - isFoundSeriesBook(book, subbook) { - if (!book.booksSet) { - book.booksSet = new Set(book.books.map(b => b.id)); + isFoundSeriesBook(seriesItem, seriesBook) { + if (!seriesItem.booksSet) { + seriesItem.booksSet = new Set(seriesItem.seriesBooks.map(b => b.id)); } - return book.booksSet.has(subbook.id); + return seriesItem.booksSet.has(seriesBook.id); } setSetting(name, newValue) { @@ -1062,22 +1074,23 @@ class Search { async getSeriesBooks(seriesItem) { //асинхронно подгружаем все книги серии, блокируем повторный вызов - if (seriesItem.allBooks === null) { - seriesItem.allBooks = undefined; + if (seriesItem.allBooksLoaded === null) { + seriesItem.allBooksLoaded = undefined; (async() => { - seriesItem.allBooks = await this.loadSeriesBooks(seriesItem.series); + seriesItem.allBooksLoaded = await this.loadSeriesBooks(seriesItem.series); - if (seriesItem.allBooks) { - seriesItem.allBooks = seriesItem.allBooks.filter(book => (this.showDeleted || !book.del)); - this.sortSeriesBooks(seriesItem.allBooks); + if (seriesItem.allBooksLoaded) { + seriesItem.allBooksLoaded = seriesItem.allBooksLoaded.filter(book => (this.showDeleted || !book.del)); + this.sortSeriesBooks(seriesItem.allBooksLoaded); + this.showMoreSeries(seriesItem); } else { - seriesItem.allBooks = null; + seriesItem.allBooksLoaded = null; } })(); } } - filterBooks(loadedBooks) { + filterBooks(books) { const s = this.search; const emptyFieldValue = '?'; @@ -1125,7 +1138,7 @@ class Search { } }; - return loadedBooks.filter((book) => { + return books.filter((book) => { //author let authorFound = false; const authors = splitAuthor(book.author); @@ -1171,22 +1184,37 @@ class Search { } showMore(item, all = false) { - if (item.loadedBooks) { + if (item.booksLoaded) { const currentLen = (item.books ? item.books.length : 0); let books; if (all) { - books = item.loadedBooks; + books = item.booksLoaded; } else { - books = item.loadedBooks.slice(0, currentLen + showMoreCount); + books = item.booksLoaded.slice(0, currentLen + showMoreCount); } - item.showMore = (books.length < item.loadedBooks.length); + item.showMore = (books.length < item.booksLoaded.length); item.books = books; } } - sortSeriesBooks(books) { - books.sort((a, b) => { + showMoreSeries(seriesItem, all = false) { + if (seriesItem.allBooksLoaded) { + const currentLen = (seriesItem.allBooks ? seriesItem.allBooks.length : 0); + let books; + if (all) { + books = seriesItem.allBooksLoaded; + } else { + books = seriesItem.allBooksLoaded.slice(0, currentLen + showMoreCount); + } + + seriesItem.showMore = (books.length < seriesItem.allBooksLoaded.length); + seriesItem.allBooks = books; + } + } + + sortSeriesBooks(seriesBooks) { + seriesBooks.sort((a, b) => { const dserno = (a.serno || Number.MAX_VALUE) - (b.serno || Number.MAX_VALUE); const dtitle = a.title.localeCompare(b.title); const dext = a.ext.localeCompare(b.ext); @@ -1220,9 +1248,8 @@ class Search { })(); } - const loadedBooks = await this.loadBooks(item.key); - - const filtered = this.filterBooks(loadedBooks); + const booksToFilter = await this.loadBooks(item.key); + const filtered = this.filterBooks(booksToFilter); const prepareBook = (book) => { return Object.assign( @@ -1246,16 +1273,18 @@ class Search { key: `${item.author}-${book.series}`, type: 'series', series: book.series, + allBooksLoaded: null, allBooks: null, showAllBooks: false, + showMore: false, - books: [], + seriesBooks: [], })); seriesIndex[book.series] = index; } - books[index].books.push(prepareBook(book)); + books[index].seriesBooks.push(prepareBook(book)); } else { books.push(prepareBook(book)); } @@ -1273,7 +1302,7 @@ class Search { //сортировка внутри серий for (const book of books) { if (book.type == 'series') { - this.sortSeriesBooks(book.books); + this.sortSeriesBooks(book.seriesBooks); //асинхронно подгрузим все книги серии, если она раскрыта if (this.isExpandedSeries(book)) { @@ -1286,7 +1315,7 @@ class Search { this.expandSeries(books[0]); } - item.loadedBooks = books; + item.booksLoaded = books; this.showMore(item); await this.$nextTick(); @@ -1351,7 +1380,7 @@ class Search { author: rec.author, name: rec.author.replace(/,/g, ', '), count, - loadedBooks: false, + booksLoaded: false, books: false, bookLoading: false, showMore: false,