diff --git a/bukuserver/static/bukuserver/js/filters_fix.js b/bukuserver/static/bukuserver/js/filters_fix.js new file mode 100644 index 00000000..b53e3bec --- /dev/null +++ b/bukuserver/static/bukuserver/js/filters_fix.js @@ -0,0 +1,7 @@ +$(document).ready(function () { + const IDX = [[36, 'a'], [10, 'A'], [0, '0']]; + let idxChar = (i, [x, c]=IDX.find(([x]) => i >= x)) => String.fromCharCode(c.charCodeAt(0) + (i-x)); + filter_form.onsubmit = function () { + $(`.filter-val[name]`, this).each((i, e) => {e.name = e.name.replace(/(?<=^flt)[^_]+(?=_)/, idxChar(i))}); + }; +}); diff --git a/bukuserver/views.py b/bukuserver/views.py index b0b31cac..76b5d441 100644 --- a/bukuserver/views.py +++ b/bukuserver/views.py @@ -180,7 +180,7 @@ def get_detail_value(self, context, model, name): edit_template = "bukuserver/bookmark_edit.html" named_filter_urls = True extra_css = ['/static/bukuserver/css/' + it for it in ('bookmark.css', 'modal.css')] - extra_js = ['/static/bukuserver/js/' + it for it in ('page_size.js', 'last_page.js')] + extra_js = ['/static/bukuserver/js/' + it for it in ('page_size.js', 'last_page.js', 'filters_fix.js')] last_page = expose('/last-page')(last_page) def __init__(self, bukudb: buku.BukuDb, *args, **kwargs): @@ -432,7 +432,7 @@ def _name_formatter(self, _, model, name): } list_template = 'bukuserver/tags_list.html' edit_template = "bukuserver/tag_edit.html" - extra_js = ['/static/bukuserver/js/' + it for it in ('page_size.js', 'last_page.js')] + extra_js = ['/static/bukuserver/js/' + it for it in ('page_size.js', 'last_page.js', 'filters_fix.js')] last_page = expose('/last-page')(last_page) def __init__(self, bukudb, *args, **kwargs): @@ -620,6 +620,8 @@ def page_of(items, size, idx): return [] def filter_key(flt, idx=''): + if isinstance(idx, int) and idx > 9: + idx = (chr(ord('A') + idx-10) if idx < 36 else chr(ord('a') + idx-36)) return 'flt' + str(idx) + '_' + BookmarkModelView._filter_arg(flt) def format_value(field, bookmark, spacing=''): diff --git a/tests/test_views.py b/tests/test_views.py index 9e843656..440f538b 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -3,6 +3,7 @@ resources: https://flask.palletsprojects.com/en/2.2.x/testing/ """ from argparse import Namespace +from unittest import mock import pytest from flask import request @@ -11,7 +12,7 @@ from buku import BukuDb from bukuserver import server -from bukuserver.views import BookmarkModelView, TagModelView +from bukuserver.views import BookmarkModelView, TagModelView, filter_key from tests.util import mock_fetch, _add_rec @@ -61,6 +62,12 @@ def bmv_instance(bukudb): return BookmarkModelView(bukudb) +@pytest.mark.parametrize('idx, char', [('', ''), (0, '0'), (9, '9'), (10, 'A'), (35, 'Z'), (36, 'a'), (61, 'z')]) +def test_filter_key(idx, char): + with mock.patch('bukuserver.views.BookmarkModelView._filter_arg', return_value='filter_name'): + assert filter_key(None, idx) == f'flt{char}_filter_name' + + @pytest.mark.parametrize('disable_favicon', [False, True]) def test_bookmark_model_view(bukudb, disable_favicon, app): inst = BookmarkModelView(bukudb)