From 11558914cd2dc60550386e730d7f14ec09577ce8 Mon Sep 17 00:00:00 2001 From: LeXofLeviafan Date: Sat, 3 Dec 2022 02:18:49 +0100 Subject: [PATCH] [bukuserver] Last page endpoint (#630) * [jarun#606] implemented a generic last-page endpoint * PR edit --- bukuserver/static/bukuserver/js/last_page.js | 4 +++ bukuserver/views.py | 31 ++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 bukuserver/static/bukuserver/js/last_page.js diff --git a/bukuserver/static/bukuserver/js/last_page.js b/bukuserver/static/bukuserver/js/last_page.js new file mode 100644 index 00000000..0e1f7e2e --- /dev/null +++ b/bukuserver/static/bukuserver/js/last_page.js @@ -0,0 +1,4 @@ +$(document).ready(function() { + $(`.pagination :contains("ยป") a`).not(`[href^="javascript:"]`).attr('href', (idx, href) => + href.replace(/\/?(\?|$)/, '/last-page$1').replace(/([?&]page=)[0-9]+(&|$)/, '$1-1$2')); +}); diff --git a/bukuserver/views.py b/bukuserver/views.py index 2a7d01a8..ef5bc0ac 100644 --- a/bukuserver/views.py +++ b/bukuserver/views.py @@ -49,6 +49,29 @@ def search(self): return redirect(url) +def last_page(self): + """Generic '/last_page' endpoint handler; based on + https://github.com/flask-admin/flask-admin/blob/v1.6.0/flask_admin/model/base.py#L1956-L1969 """ + # Grab parameters from URL + view_args = self._get_list_extra_args() + + # Map column index to column name + sort_column = self._get_column_by_idx(view_args.sort) + if sort_column is not None: + sort_column = sort_column[0] + + # Get page size + page_size = view_args.page_size or self.page_size + + # Get count and data + count, data = self.get_list(-1, sort_column, view_args.sort_desc, + view_args.search, view_args.filters, page_size=page_size) + + args = request.args.copy() + args.setlist('page', [max(0, view_args.page + (count + page_size - 1) // page_size)]) + return redirect(url_for('.index_view', **args)) + + class BookmarkModelView(BaseModelView): @staticmethod def _filter_arg(flt): @@ -132,7 +155,8 @@ def _list_entry(self, context: Any, model: Namespace, name: str) -> Markup: edit_template = "bukuserver/bookmark_edit.html" named_filter_urls = True extra_css = ['/static/bukuserver/css/bookmark.css'] - extra_js = ['/static/bukuserver/js/page_size.js'] + extra_js = ['/static/bukuserver/js/' + it for it in ('page_size.js', 'last_page.js')] + last_page = expose('/last-page')(last_page) def __init__(self, *args, **kwargs): self.bukudb: buku.BukuDb = args[0] @@ -425,7 +449,8 @@ def _name_formatter(self, _, model, name): "name": _name_formatter, } list_template = 'bukuserver/tags_list.html' - extra_js = ['/static/bukuserver/js/page_size.js'] + extra_js = ['/static/bukuserver/js/' + it for it in ('page_size.js', 'last_page.js')] + last_page = expose('/last-page')(last_page) def __init__(self, *args, **kwargs): self.bukudb = args[0] @@ -440,7 +465,7 @@ def __init__(self, *args, **kwargs): @expose('/refresh', methods=['POST']) def refresh(self): self.all_tags = self.bukudb.get_tag_all() - return redirect(request.referrer or url_for('tags.index_page')) + return redirect(request.referrer or url_for('.index_view')) def scaffold_list_columns(self): return ["name", "usage_count"]