Skip to content

Commit

Permalink
Improve the Pagination system.
Browse files Browse the repository at this point in the history
  • Loading branch information
AAA3A-AAA3A committed May 20, 2024
1 parent a7ad6dd commit f1d842b
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 99 deletions.
2 changes: 1 addition & 1 deletion reddash/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
63 changes: 61 additions & 2 deletions reddash/app/pagination.py
Original file line number Diff line number Diff line change
@@ -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]:
Expand All @@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -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 = """<br />
<div id="KEY-pagination"></div>
<script>
{% if KEY.has_prev() or KEY.has_next() %}
document.addEventListener("DOMContentLoaded", function () {
{% if KEY.page|string != request.args.get("page", KEY.default_page|string) %}
window.history.pushState({}, "", '{{ url_for_query(page=KEY.page if KEY.page != KEY.default_page else None) }}');
{% endif %}
var pagination = $("#KEY-pagination").pagination({
dataSource: {{ KEY.elements_numbers|tojson }},
pageSize: {{ KEY.per_page }},
pageNumber: {{ KEY.page }},
callback: function(data, pagination) {
if (pagination.pageNumber == {{ KEY.page }}) {
return;
}
if (pagination.pageNumber == {{ KEY.default_page }}) {
redirect_url = "{{ url_for_query(page=None) }}";
} else {
redirect_url = '{{ url_for_query(page="1234567890") }}'.replace("1234567890", pagination.pageNumber);
}
document.location.href = redirect_url.replace("amp;", "");
},
beforeSizeSelectorChange: function (event) {
var newPageSize = event.target.value;
if (newPageSize == {{ KEY.per_page }}) {
return;
}
if (newPageSize == {{ KEY.default_per_page }}) {
redirect_url = "{{ url_for_query(page=None, per_page=None) }}";
} else {
redirect_url = '{{ url_for_query(page=None, per_page="1234567890") }}'.replace("1234567890", newPageSize);
}
document.location.href = redirect_url.replace("amp;", "");
},
className: 'paginationjs-big paginationjs-theme-green',
showSizeChanger: true,
showGoInput: true,
showGoButton: true,
autoHidePrevious: true,
autoHideNext: true,
goButtonText: '{{ _("Go") }}',
})
});
{% endif %}
</script>""".replace("KEY", KEY)
if not render_template_string:
return html
from flask import render_template_string
return Markup(render_template_string(html, **{KEY: self}))
47 changes: 1 addition & 46 deletions reddash/app/templates/pages/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@ <h6 class="mb-0">
{% endfor %}
</div>
</div>
<br />
<div id="guilds-pagination"></div>
{{ guilds.to_html("guilds") }}
</div>
</div>
</div>
Expand All @@ -84,48 +83,4 @@ <h6 class="mb-0">
}
}
</script>
<script>
{% if guilds.has_prev() or guilds.has_next() %}
document.addEventListener("DOMContentLoaded", function () {
{% if guilds.page|string != request.args.get("page", "1") %}
window.history.pushState({}, "", '{{ url_for_query(page=guilds.page if guilds.page != 1 else None) }}');
{% endif %}
var pagination = $("#guilds-pagination").pagination({
dataSource: {{ guilds.elements_numbers|tojson }},
pageSize: {{ guilds.per_page }},
pageNumber: {{ guilds.page }},
callback: function(data, pagination) {
if (pagination.pageNumber == {{ guilds.page }}) {
return;
}
if (pagination.pageNumber == 1) {
redirect_url = "{{ url_for_query(page=None) }}";
} else {
redirect_url = '{{ url_for_query(page="1234567890") }}'.replace("1234567890", pagination.pageNumber);
}
document.location.href = redirect_url.replace("amp;", "");
},
beforeSizeSelectorChange: function (event) {
var newPageSize = event.target.value;
if (newPageSize == {{ guilds.per_page }}) {
return;
}
if (newPageSize == {{ guilds.DEFAULT_PER_PAGE }}) {
redirect_url = "{{ url_for_query(page=None, per_page=None) }}";
} else {
redirect_url = '{{ url_for_query(page=None, per_page="1234567890") }}'.replace("1234567890", newPageSize);
}
document.location.href = redirect_url.replace("amp;", "");
},
className: 'paginationjs-big paginationjs-theme-green',
showSizeChanger: true,
showGoInput: true,
showGoButton: true,
autoHidePrevious: true,
autoHideNext: true,
goButtonText: '{{ _("Go") }}',
})
});
{% endif %}
</script>
{% endblock %}
52 changes: 2 additions & 50 deletions reddash/app/third_parties/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"] += """
<br />
<div id="KEY-pagination"></div>
<script>
{% if KEY.has_prev() or KEY.has_next() %}
document.addEventListener("DOMContentLoaded", function () {
{% if KEY.page|string != request.args.get("page", "1") %}
window.history.pushState({}, "", '{{ url_for_query(page=KEY.page if KEY.page != 1 else None) }}');
{% endif %}
var pagination = $("#KEY-pagination").pagination({
dataSource: {{ KEY.elements_numbers|tojson }},
pageSize: {{ KEY.per_page }},
pageNumber: {{ KEY.page }},
callback: function(data, pagination) {
if (pagination.pageNumber == {{ KEY.page }}) {
return;
}
if (pagination.pageNumber == 1) {
redirect_url = "{{ url_for_query(page=None) }}";
} else {
redirect_url = '{{ url_for_query(page="1234567890") }}'.replace("1234567890", pagination.pageNumber);
}
document.location.href = redirect_url.replace("amp;", "");
},
beforeSizeSelectorChange: function (event) {
var newPageSize = event.target.value;
if (newPageSize == {{ KEY.per_page }}) {
return;
}
if (newPageSize == {{ KEY.DEFAULT_PER_PAGE }}) {
redirect_url = "{{ url_for_query(page=None, per_page=None) }}";
} else {
redirect_url = '{{ url_for_query(page=None, per_page="1234567890") }}'.replace("1234567890", newPageSize);
}
document.location.href = redirect_url.replace("amp;", "");
},
className: 'paginationjs-big paginationjs-theme-green',
showSizeChanger: true,
showGoInput: true,
showGoButton: true,
autoHidePrevious: true,
autoHideNext: true,
goButtonText: '{{ _("Go") }}',
})
});
{% endif %}
</script>
""".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"]
Expand Down

0 comments on commit f1d842b

Please sign in to comment.