From c2c744dbc0e234ecc2f895e0f5a8fc31ee0090ae Mon Sep 17 00:00:00 2001 From: Neil McGuigan Date: Sun, 9 Apr 2023 17:38:40 -0700 Subject: [PATCH 1/4] added render_sortlink macro --- flask_bootstrap/templates/base/utils.html | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/flask_bootstrap/templates/base/utils.html b/flask_bootstrap/templates/base/utils.html index 014bc501..11c1ca99 100644 --- a/flask_bootstrap/templates/base/utils.html +++ b/flask_bootstrap/templates/base/utils.html @@ -30,3 +30,48 @@ {{ url_for(endpoint, **kargs) }} {%- endwith %} {%- endmacro %} + + +{% macro render_sortlink( + attr, + text = attr | title, + icon_asc = config.BOOTSTRAP_SORT_ICON_ASC or "caret-up", + icon_desc = config.BOOTSTRAP_SORT_ICON_DESC or "caret-down", + sort_style = config.BOOTSTRAP_SORT_STYLE or "csv", + sort_param = config.BOOTSTRAP_SORT_PARAM or "sort", + sort_dir_param = config.BOOTSTRAP_SORT_DIR_PARAM or "dir", + sort_asc_value = config.BOOTSTRAP_SORT_ASC_VALUE or "asc", + sort_desc_value = config.BOOTSTRAP_SORT_DESC_VALUE or "desc", + sort_title_template = config.SORT_TITLE_TEMPLATE or "Sort %s (%s)", + sort_value_name_map = config.SORT_VALUE_NAME_MAP or {"asc": "Ascending", "desc": "Descending"} + + ) %} + + {% if sort_style == "csv" %} + {% set curr_attr, _, curr_dir = request.args.get(sort_param, "").partition(",")%} + {% else %} + {% set curr_attr = request.args.get(sort_param) %} + {% set curr_dir = request.args.get(sort_dir_param) %} + {% endif %} + + {% set desired_dir = sort_desc_value if curr_attr == attr and curr_dir == sort_asc_value else + sort_asc_value %} + + {% set args = request.args.copy() %} + + {% if sort_style == "csv" %} + {% set _ = args.setlist(sort_param, ["%s,%s" | format(attr, desired_dir)])%} + {% else %} + {% set _ = args.setlist(sort_param, [attr])%} + {% set _ = args.setlist(sort_dir_param, [desired_dir]) %} + {% endif %} + + {% if sort_title_template %} + {% set _ = link_attrs.update({"title":sort_title_template | format(text, sort_value_name_map[desired_dir])}) %} + {% endif %} + + + {{text}} + {{render_icon(icon_asc if desired_dir == sort_desc_value else icon_desc) if attr == curr_attr}} + + {% endmacro %} From f41a88e9adefbe1a2bd57c3c2ec6f84655a34501 Mon Sep 17 00:00:00 2001 From: Neil McGuigan Date: Sun, 9 Apr 2023 17:39:40 -0700 Subject: [PATCH 2/4] added test for render_sortlink --- tests/test_bootstrap4/test_render_sortlink.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 tests/test_bootstrap4/test_render_sortlink.py diff --git a/tests/test_bootstrap4/test_render_sortlink.py b/tests/test_bootstrap4/test_render_sortlink.py new file mode 100644 index 00000000..961e0dbf --- /dev/null +++ b/tests/test_bootstrap4/test_render_sortlink.py @@ -0,0 +1,24 @@ +from flask import render_template_string + + +def test_render_sortlink(app, client): + @app.route("/sortlink") + def sortlink(): + return render_template_string( + """ + {% from 'bootstrap4/utils.html' import render_sortlink %} + {{ render_sortlink('foo') }} + """ + ) + + response = client.get("/sortlink") + data = response.get_data(as_text=True) + assert "?sort=foo,asc" in data + + response = client.get("/sortlink?sort=foo,asc") + data = response.get_data(as_text=True) + assert "?sort=foo,desc" in data + + response = client.get("/sortlink?sort=foo,desc") + data = response.get_data(as_text=True) + assert "?sort=foo,asc" in data From 86aca739f46e271c2dbcc0610c9727f925f6dc2d Mon Sep 17 00:00:00 2001 From: Neil McGuigan Date: Sun, 9 Apr 2023 17:46:52 -0700 Subject: [PATCH 3/4] Update utils.html --- flask_bootstrap/templates/base/utils.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_bootstrap/templates/base/utils.html b/flask_bootstrap/templates/base/utils.html index 11c1ca99..99029e2e 100644 --- a/flask_bootstrap/templates/base/utils.html +++ b/flask_bootstrap/templates/base/utils.html @@ -43,8 +43,8 @@ sort_asc_value = config.BOOTSTRAP_SORT_ASC_VALUE or "asc", sort_desc_value = config.BOOTSTRAP_SORT_DESC_VALUE or "desc", sort_title_template = config.SORT_TITLE_TEMPLATE or "Sort %s (%s)", - sort_value_name_map = config.SORT_VALUE_NAME_MAP or {"asc": "Ascending", "desc": "Descending"} - + sort_value_name_map = config.SORT_VALUE_NAME_MAP or {"asc": "Ascending", "desc": "Descending"}, + link_attrs = {} ) %} {% if sort_style == "csv" %} From db23a231f369f2325f73e9898ce1fd1caf8e2d02 Mon Sep 17 00:00:00 2001 From: Neil McGuigan Date: Sun, 9 Apr 2023 17:50:26 -0700 Subject: [PATCH 4/4] Update utils.html --- flask_bootstrap/templates/base/utils.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_bootstrap/templates/base/utils.html b/flask_bootstrap/templates/base/utils.html index 99029e2e..1c6df465 100644 --- a/flask_bootstrap/templates/base/utils.html +++ b/flask_bootstrap/templates/base/utils.html @@ -71,7 +71,7 @@ {% endif %} - {{text}} + {{text}} {{render_icon(icon_asc if desired_dir == sort_desc_value else icon_desc) if attr == curr_attr}} {% endmacro %}