X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/5bd864493e531e5600c5ca989825d89cc3ee1487..a3b153ea6e30da275edf3e34b8d2f8ca1bb436cc:/src/catalogue/static/2022/book/filter.js diff --git a/src/catalogue/static/2022/book/filter.js b/src/catalogue/static/2022/book/filter.js index ac2674996..2ff426234 100644 --- a/src/catalogue/static/2022/book/filter.js +++ b/src/catalogue/static/2022/book/filter.js @@ -1,24 +1,93 @@ (function($) { + let unpagedSearch = null; + if (!$(".quick-filter").val() && !$('.l-pagination li').length) { + unpagedSearch = ''; + } + + function get_page(page, search, ordering, callback) { + get_page_by_url('.?page=' + page + '&order=' + ordering + '&search=' + search, callback); + } + + let lastFulfilledPage = 0; + + function get_page_by_url(url, callback) { + let requestTime = + new Date(); + $.get( + url, + function(data) { + if (lastFulfilledPage > requestTime) return; + lastFulfilledPage = requestTime; + + html = $(data); + objectList = $('#object-list', html); + paginate = $('#paginate', html); + + ids = new Set(); + $(".icon-like", objectList).each( + (i, e)=>{ + ids.add($(e).attr('data-book')); + } + ); + ids = [...ids].join(','); + $.refreshLikes(ids); + + $('#book-list').html(objectList.children()); + $('#paginator').html(paginate.children()); + history.replaceState({}, '', url); + callback && callback(); + } + ) + } + + $("#paginator").on('click', 'a', function() { + get_page_by_url(url=$(this).attr('href')); + return false; + }); + $(".quick-filter").each(function() { let bookList = $('#' + $(this).data('for')); let filterList = $('.' + $(this).data('filters')); + $(this).on('focus', function() { filterList.addClass('filters-enabled'); }); $(this).on('blur', function() { filterList.removeClass('filters-enabled'); }); + $(this).on('input propertychange', function() { let search = $(this).val().toLowerCase(); - bookList.children().each(function() { - found = !search || $("h2", this).text().toLowerCase().search(search) != -1; + + if (!search.startsWith(unpagedSearch)) { + get_page(1, search, 'title', function() { + if ($('.l-pagination li').length) { + unpagedSearch = null; + } + }) + } else { + bookList.children().each(function() { + found = !search || + $(".s", this).text().toLowerCase().search(search) != -1 + ; + if (found) + $(this).fadeIn(); + else + $(this).fadeOut(); + }); + } + + $('.filter-container', filterList).children().each(function() { + found = !search || + $(this).text().toLowerCase().search(search) != -1 + ; if (found) $(this).fadeIn(); else $(this).fadeOut(); }); }); + }); $(".l-books__sorting button").on('click', function() { @@ -26,19 +95,40 @@ $(".is-active", $(this).parent()).removeClass("is-active"); $(this).addClass("is-active"); let prop = $(this).attr('data-order'); + $(".l-books__sorting select").val(prop); + if (prop == '-') prop = ''; + resort(prop); + }); + $(".l-books__sorting select").on('change', function() { + let prop = $(this).val(); + $(".is-active", $(this).parent()).removeClass("is-active"); + $("[data-order='" + prop +"']", $(this).parent()).addClass("is-active"); + if (prop == '-') prop = ''; + resort(prop); + }); + + function resort(prop) { + // do we NOW have pages (possibly after filtering)? + // if we don't have pages, we can just sort here. + let havePages = $('.l-pagination li').length > 0; + $(".l-books__item").css('opacity', '0'); setTimeout(function() { - if (prop) { - $(".l-books__item").each(function() { - $(this).css('order', $(this).attr(prop)); - }); + if (havePages) { + get_page(1, '', prop); } else { - $(".l-books__item").css('order', ''); + if (prop) { + $(".l-books__item").each(function() { + $(this).css('order', $(this).attr('data-' + prop)); + }); + } else { + $(".l-books__item").css('order', ''); + } + setTimeout(function() { + $(".l-books__item").css('opacity', '100%'); + }, 200); } - setTimeout(function() { - $(".l-books__item").css('opacity', '100%'); - }, 200); }, 200); - }); + } })(jQuery);