Cutting stuff out.
[wolnelektury.git] / src / catalogue / static / 2022 / book / filter.js
index ac26749..2ff4262 100644 (file)
@@ -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() {
         $(".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);