Added UI pagination.

This commit is contained in:
BurnyLlama 2021-11-13 20:12:01 +01:00
parent 742a25cde8
commit ea7a02fc86
6 changed files with 69 additions and 16 deletions

View File

@ -13,14 +13,14 @@ routes.get(
) )
routes.get( routes.get(
'/search', '/maps',
(req, res) => { (req, res) => {
const map = req.query.map ?? "" const map = req.query.map ?? ""
const categories = req.query.categories ? req.query.categories : "Novice,Moderate,Brutal,Insane,Dummy,DDmaX,Oldschool,Solo,Race,Fun" const categories = req.query.categories ? req.query.categories : "Novice,Moderate,Brutal,Insane,Dummy,DDmaX,Oldschool,Solo,Race,Fun"
const stars = req.query.stars ? req.query.stars : "0,1,2,3,4,5" const stars = req.query.stars ? req.query.stars : "0,1,2,3,4,5"
const sort = req.query.sortBy ? req.query.sortBy : "map" const sort = req.query.sortBy ? req.query.sortBy : "map"
const order = req.query.order === "desc" ? "desc" : "asc" const order = req.query.order === "desc" ? "desc" : "asc"
const page = req.query.page ? req.query.page : "1" const page = req.query.page ? parseInt(req.query.page) : 1
const maps = wrapper.searchMap(map, categories.split(","), stars.split(","), sort, order, page) const maps = wrapper.searchMap(map, categories.split(","), stars.split(","), sort, order, page)
@ -28,14 +28,6 @@ routes.get(
} }
) )
routes.get(
'/maps',
(req, res) => {
const maps = wrapper.allMaps()
tx(req, res)('pages/maps.njk', { maps }, true, { currentSection: "maps" })
}
)
routes.get( routes.get(
'/maps/:map', '/maps/:map',
(req, res) => { (req, res) => {

View File

@ -237,6 +237,45 @@ label {
//
// PAGINATION
//
.pages {
width: 100%;
justify-content: center;
}
.page {
margin: .5rem;
padding: .15rem .5rem;
border: .1rem solid palette.$accent;
border-radius: settings.$border_radius_s;
color: palette.$accent;
background-color: transparent;
cursor: pointer;
text-decoration: none transparent;
transition: color .3s, background-color .3s;
&:hover {
color: palette.$surface;
background-color: palette.$accent;
}
&.current-page {
color: palette.$primary;
border-color: palette.$primary;
&:hover {
color: palette.$surface;
background-color: palette.$primary;
}
}
}
// //
// TABLES // TABLES
// //

View File

@ -1 +1 @@
*,*::before,*::after{margin:0;padding:0;border:0 none transparent;box-sizing:border-box;scroll-behavior:smooth;font-family:"Manrope Regular",sans-serif;font-size:1rem;line-height:1.5}html,body{color:#e0e0ff;background-color:#10102f;height:100%}nav{display:flex;align-items:center;background-color:#20203f;border-radius:0 0 2rem 2rem;box-shadow:.5rem 0 4rem #00001f;margin:0 0 2rem 0;padding:1rem 2rem}nav .logo{width:3rem;height:3rem;margin-right:2rem;border-radius:100%;background-color:#ee588f}nav a{color:#fba7c6;border-bottom:.1rem solid transparent;margin:.25rem 1rem .5rem 1rem;padding:.15rem .5rem .25rem .5rem;font-size:1.25rem;text-decoration:none transparent;transition:border .3s}nav a:hover{border-bottom:.1rem solid #fba7c6}nav a.current{color:#ee588f}nav a.current:hover{border-bottom:.1rem solid #ee588f}.flex-container{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-around;margin:0 10vw}header,h1,h2,h3,h4,h5,h6{color:#fba7c6}header{font-size:4rem}h1{font-size:1.5rem;font-weight:normal}h2{font-size:1.35rem;font-weight:normal}h3{font-size:1.2rem;font-weight:normal}h4{font-size:1.05rem;font-weight:normal}h5{font-size:.9rem;font-weight:normal}a{color:#a3cefa}form{display:flex;flex-direction:column;justify-content:center;align-items:center}input{color:#e0e0ff;background-color:#20203f;margin:1em 0;padding:.75em 1.25em;outline:0 none transparent;border:.2rem solid transparent;border-radius:.5rem;box-shadow:.25rem 0 2rem #00001f;transition:border .3s,background-color .5s,border-radius .5s}input:hover{background-color:#30304f;border-radius:1rem}input:active,input:focus{border:.2rem solid #ee588f}button[type=submit]{margin:.75rem auto 1.25rem auto;padding:.15rem .5rem;border:.1rem solid #fba7c6;border-radius:.5rem;color:#fba7c6;background-color:transparent;cursor:pointer;text-decoration:none transparent;transition:color .3s,background-color .3s}button[type=submit]:hover{color:#10102f;background-color:#fba7c6}label{cursor:pointer;margin:.25rem 0}label>input[type=radio]{-webkit-appearance:none;appearance:none;cursor:pointer;margin:0 .5rem -0.25rem 1rem;padding:0;width:1.25rem;height:1.25rem;background-color:#e0e0ff;border:.25rem solid #e0e0ff;border-radius:100%}label>input[type=radio]:checked{border-color:#ee588f}label:hover>input[type=radio]{background-color:#fba7c6}#search{display:grid;grid-template-columns:2fr 1fr;grid-template-columns:repeat(auto, 4);grid-template-areas:"header header" "map map" "category category" "stars sort" "submit submit";width:min(90ch,80vw);margin:2rem 10vw}#search>*{width:100%}#search h1{grid-area:header}#search #map{grid-area:map}#search #categories{grid-area:category}#search #stars{grid-area:stars}#search .sorting{grid-area:sort;display:flex;flex-direction:column}#search button[type=submit]{grid-area:submit;width:max-content;margin:auto}tr{width:max-content}tr td{padding:.25rem 0;vertical-align:middle;width:max-content}tr td:first-child{padding:.25rem 1.5rem .25rem 0}footer{display:flex;flex-direction:column;align-items:center;margin:5vh 2rem}footer a{color:#74b6fb;font-size:.8rem} *,*::before,*::after{margin:0;padding:0;border:0 none transparent;box-sizing:border-box;scroll-behavior:smooth;font-family:"Manrope Regular",sans-serif;font-size:1rem;line-height:1.5}html,body{color:#e0e0ff;background-color:#10102f;height:100%}nav{display:flex;align-items:center;background-color:#20203f;border-radius:0 0 2rem 2rem;box-shadow:.5rem 0 4rem #00001f;margin:0 0 2rem 0;padding:1rem 2rem}nav .logo{width:3rem;height:3rem;margin-right:2rem;border-radius:100%;background-color:#ee588f}nav a{color:#fba7c6;border-bottom:.1rem solid transparent;margin:.25rem 1rem .5rem 1rem;padding:.15rem .5rem .25rem .5rem;font-size:1.25rem;text-decoration:none transparent;transition:border .3s}nav a:hover{border-bottom:.1rem solid #fba7c6}nav a.current{color:#ee588f}nav a.current:hover{border-bottom:.1rem solid #ee588f}.flex-container{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-around;margin:0 10vw}header,h1,h2,h3,h4,h5,h6{color:#fba7c6}header{font-size:4rem}h1{font-size:1.5rem;font-weight:normal}h2{font-size:1.35rem;font-weight:normal}h3{font-size:1.2rem;font-weight:normal}h4{font-size:1.05rem;font-weight:normal}h5{font-size:.9rem;font-weight:normal}a{color:#a3cefa}form{display:flex;flex-direction:column;justify-content:center;align-items:center}input{color:#e0e0ff;background-color:#20203f;margin:1em 0;padding:.75em 1.25em;outline:0 none transparent;border:.2rem solid transparent;border-radius:.5rem;box-shadow:.25rem 0 2rem #00001f;transition:border .3s,background-color .5s,border-radius .5s}input:hover{background-color:#30304f;border-radius:1rem}input:active,input:focus{border:.2rem solid #ee588f}button[type=submit]{margin:.75rem auto 1.25rem auto;padding:.15rem .5rem;border:.1rem solid #fba7c6;border-radius:.5rem;color:#fba7c6;background-color:transparent;cursor:pointer;text-decoration:none transparent;transition:color .3s,background-color .3s}button[type=submit]:hover{color:#10102f;background-color:#fba7c6}label{cursor:pointer;margin:.25rem 0}label>input[type=radio]{-webkit-appearance:none;appearance:none;cursor:pointer;margin:0 .5rem -0.25rem 1rem;padding:0;width:1.25rem;height:1.25rem;background-color:#e0e0ff;border:.25rem solid #e0e0ff;border-radius:100%}label>input[type=radio]:checked{border-color:#ee588f}label:hover>input[type=radio]{background-color:#fba7c6}#search{display:grid;grid-template-columns:2fr 1fr;grid-template-columns:repeat(auto, 4);grid-template-areas:"header header" "map map" "category category" "stars sort" "submit submit";width:min(90ch,80vw);margin:2rem 10vw}#search>*{width:100%}#search h1{grid-area:header}#search #map{grid-area:map}#search #categories{grid-area:category}#search #stars{grid-area:stars}#search .sorting{grid-area:sort;display:flex;flex-direction:column}#search button[type=submit]{grid-area:submit;width:max-content;margin:auto}.pages{width:100%;justify-content:center}.page{margin:.5rem;padding:.15rem .5rem;border:.1rem solid #fba7c6;border-radius:.5rem;color:#fba7c6;background-color:transparent;cursor:pointer;text-decoration:none transparent;transition:color .3s,background-color .3s}.page:hover{color:#10102f;background-color:#fba7c6}.page.current-page{color:#ee588f;border-color:#ee588f}.page.current-page:hover{color:#10102f;background-color:#ee588f}tr{width:max-content}tr td{padding:.25rem 0;vertical-align:middle;width:max-content}tr td:first-child{padding:.25rem 1.5rem .25rem 0}footer{display:flex;flex-direction:column;align-items:center;margin:5vh 2rem}footer a{color:#74b6fb;font-size:.8rem}

View File

@ -3,5 +3,5 @@
<a href="/maps" class="{{ "current" if options.currentSection == "maps" }}">Maps</a> <a href="/maps" class="{{ "current" if options.currentSection == "maps" }}">Maps</a>
<a href="/leaderboards" class="{{ "current" if options.currentSection == "leaderboards" }}">Leaderboards</a> <a href="/leaderboards" class="{{ "current" if options.currentSection == "leaderboards" }}">Leaderboards</a>
<a href="/tournaments" class="{{ "current" if options.currentSection == "tournaments" }}">Tournaments</a> <a href="/players" class="{{ "current" if options.currentSection == "players" }}">Players</a>
</nav> </nav>

View File

@ -30,3 +30,19 @@
{{- millis -}} {{- millis -}}
{%- endif -%} {%- endif -%}
{% endmacro %} {% endmacro %}
{% macro pager(pageNum, maxPage) %}
<a class="page {{ "current-page" if page === pageNum }}" href="?page=1">1</a>
<p>{{ "..." if (pageNum - 2 > 1) }}</p>
{% for page in range(pageNum - 2, pageNum + 3) %}
{% if page > 1 and page < maxPage %}
<a class="page {{ "current-page" if page === pageNum }}" href="?page={{ page }}">{{ page }}</a>
{% endif %}
{% endfor %}
<p>{{ "..." if (pageNum + 2 < maxPage) }}</p>
{% if maxPage > 1 %}
<a class="page {{ "current-page" if page === pageNum }}" href="?page={{ maxPage }}">{{ maxPage }}</a>
{% endif %}
{% endmacro %}

View File

@ -1,5 +1,6 @@
{% extends "../templates/basic.njk" %} {% extends "../templates/basic.njk" %}
{% import "../components/_map.njk" as mapComponent %} {% import "../components/_map.njk" as mapComponent %}
{% import "../components/_utils.njk" as utils %}
{% block head %} {% block head %}
<title>DDStats - Maps!</title> <title>DDStats - Maps!</title>
@ -7,11 +8,8 @@
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<h3> Found: {{ data.maps.pageInfo.mapCount }} Page: {{ data.maps.pageInfo.page }}/{{ data.maps.pageInfo.totalPages }}
<main class="flex-container"> <main class="flex-container">
<form action="/search" method="get" id="search"> <form action="/maps" method="get" id="search">
<h1>Search</h1> <h1>Search</h1>
<input type="text" name="map" id="map" placeholder="Map name"> <input type="text" name="map" id="map" placeholder="Map name">
<input type="text" name="categories" id="categories" placeholder="Category"> <input type="text" name="categories" id="categories" placeholder="Category">
@ -31,8 +29,16 @@
<button type="submit">Search!</button> <button type="submit">Search!</button>
</form> </form>
<div class="flex-container pages">
{{ utils.pager(data.maps.pageInfo.page, data.maps.pageInfo.totalPages) }}
</div>
{% for map in data.maps.maps %} {% for map in data.maps.maps %}
{{ mapComponent.card(map) }} {{ mapComponent.card(map) }}
{% endfor %} {% endfor %}
<div class="flex-container pages">
{{ utils.pager(data.maps.pageInfo.page, data.maps.pageInfo.totalPages) }}
</div>
</main> </main>
{% endblock %} {% endblock %}