From f1d842b527dcc820ec3191922c2637dc001192df Mon Sep 17 00:00:00 2001 From: AAA3A <89632044+AAA3A-AAA3A@users.noreply.github.com> Date: Mon, 20 May 2024 16:49:01 +0200 Subject: [PATCH] Improve the `Pagination` system. --- reddash/__init__.py | 2 +- reddash/app/pagination.py | 63 +++++++++++++++++++++- reddash/app/templates/pages/dashboard.html | 47 +--------------- reddash/app/third_parties/routes.py | 52 +----------------- 4 files changed, 65 insertions(+), 99 deletions(-) diff --git a/reddash/__init__.py b/reddash/__init__.py index c1142e8..7f4c984 100644 --- a/reddash/__init__.py +++ b/reddash/__init__.py @@ -4,7 +4,7 @@ Copyright (c) 2020 - present Neuro Assassin (https://github.com/Cog-Creators/Red-Dashboard) """ -__version__ = "1.6.1" +__version__ = "1.6.2" __authos__ = ["Neuro Assassin", "AAA3A"] from .app import FlaskApp diff --git a/reddash/app/pagination.py b/reddash/app/pagination.py index a60ab36..b8b57a8 100644 --- a/reddash/app/pagination.py +++ b/reddash/app/pagination.py @@ -1,16 +1,21 @@ import typing # isort:skip +from markupsafe import Markup + class Pagination(typing.List): """Pagination class for lists.""" - DEFAULT_PER_PAGE = 20 + DEFAULT_PER_PAGE: int = 20 + DEFAULT_PAGE: int = 1 def __init__(self, *args, **kwargs) -> None: self.total: int = kwargs.pop("total", None) self.per_page: int = kwargs.pop("per_page", None) self.pages: int = kwargs.pop("pages", None) self.page: int = kwargs.pop("page", None) + self.default_per_page: int = kwargs.pop("default_per_page", self.DEFAULT_PER_PAGE) + self.default_page: int = kwargs.pop("default_page", 1) super().__init__(*args, **kwargs) def to_dict(self) -> typing.Dict[str, typing.Any]: @@ -20,6 +25,8 @@ def to_dict(self) -> typing.Dict[str, typing.Any]: "per_page": self.per_page, "pages": self.pages, "page": self.page, + "default_per_page": self.default_per_page, + "default_page": self.default_page, } def __repr__(self) -> str: @@ -46,7 +53,7 @@ def from_list( per_page: typing.Optional[typing.Union[int, str]] = None, page: typing.Optional[typing.Union[int, str]] = None, default_per_page: int = DEFAULT_PER_PAGE, - default_page: int = 1, + default_page: int = DEFAULT_PAGE, ) -> typing.Any: per_page = ( default_per_page @@ -74,3 +81,55 @@ def from_list( pages=pages, page=page, ) + + def to_html(self, KEY: str = "pagination", render_template_string: bool = True) -> Markup: + html = """
+
+ """.replace("KEY", KEY) + if not render_template_string: + return html + from flask import render_template_string + return Markup(render_template_string(html, **{KEY: self})) diff --git a/reddash/app/templates/pages/dashboard.html b/reddash/app/templates/pages/dashboard.html index 1ca1a84..a322f7d 100644 --- a/reddash/app/templates/pages/dashboard.html +++ b/reddash/app/templates/pages/dashboard.html @@ -62,8 +62,7 @@
{% endfor %} -
-
+ {{ guilds.to_html("guilds") }} @@ -84,48 +83,4 @@
} } - {% endblock %} diff --git a/reddash/app/third_parties/routes.py b/reddash/app/third_parties/routes.py index e35ba08..d7ecb35 100644 --- a/reddash/app/third_parties/routes.py +++ b/reddash/app/third_parties/routes.py @@ -248,59 +248,11 @@ async def third_party(name: str, page: str = None, guild_id: str = None): if "web_content" in result: for key, value in result["web_content"].items(): if isinstance(value, typing.Dict) and "items" in value: - result["web_content"][key] = Pagination( + result["web_content"][key]: Pagination = Pagination( value.pop("items"), **value, ) - result["web_content"]["source"] += """ - -
-
- - """.replace("KEY", key) + result["web_content"]["source"] += "\n\n" + result["web_content"][key].to_html(key, render_template_string=False) if result["web_content"].get("standalone", False): return render_template_string( name=name, page=page, **return_guild, **result["web_content"]