mirror of
https://codeberg.org/demostf/frontend.git
synced 2026-06-03 18:24:12 +02:00
load more
This commit is contained in:
parent
495a64e389
commit
69dbfe3f5e
7 changed files with 54 additions and 12 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
import {render} from "solid-js/web";
|
import {render} from "solid-js/web";
|
||||||
import {ready} from "./ready";
|
import {ready} from "./ready";
|
||||||
import {FilterBar} from "./filterbar"
|
import {FilterBar, queryForFilter} from "./filterbar"
|
||||||
import {Api, SteamId} from "./api";
|
import {Api, SteamId} from "./api";
|
||||||
|
|
||||||
let lastFilter = {
|
let lastFilter = {
|
||||||
|
|
@ -12,6 +12,7 @@ let lastFilter = {
|
||||||
|
|
||||||
ready(async () => {
|
ready(async () => {
|
||||||
const filterBar = document.getElementById('filter-bar');
|
const filterBar = document.getElementById('filter-bar');
|
||||||
|
const moreButton = document.getElementById('load-more');
|
||||||
const maps = filterBar.dataset.maps.split(",");
|
const maps = filterBar.dataset.maps.split(",");
|
||||||
const apiBase = filterBar.dataset.apiBase;
|
const apiBase = filterBar.dataset.apiBase;
|
||||||
const api = new Api(apiBase);
|
const api = new Api(apiBase);
|
||||||
|
|
@ -36,10 +37,16 @@ ready(async () => {
|
||||||
players,
|
players,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
moreButton.addEventListener('click', () => {
|
||||||
|
more(api, demoListBody, lastFilter);
|
||||||
|
});
|
||||||
|
|
||||||
if (window.location.href.includes("uploads/")) {
|
if (window.location.href.includes("uploads/")) {
|
||||||
[, lastFilter.uploader] = window.location.href.split("uploads/");
|
[, lastFilter.uploader] = window.location.href.split("uploads/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
render(() => <FilterBar maps={maps} api={api} initialFilter={lastFilter}
|
render(() => <FilterBar maps={maps} api={api} initialFilter={lastFilter}
|
||||||
onChange={onFilter.bind(null, api, demoListBody)}/>, filterBar);
|
onChange={onFilter.bind(null, api, demoListBody)}/>, filterBar);
|
||||||
});
|
});
|
||||||
|
|
@ -56,15 +63,23 @@ const onFilter = async (api, demoListBody, filter) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lastFilter = filter;
|
lastFilter = filter;
|
||||||
|
const response = await fetch("/fragments/demo-list?" + queryForFilter(filter));
|
||||||
let queryParams = new URLSearchParams({
|
|
||||||
players: filter.players.map(player => player.steamid).join(','),
|
|
||||||
mode: (filter.mode || "").toLowerCase(),
|
|
||||||
map: filter.map || "",
|
|
||||||
});
|
|
||||||
if (filter.uploader) {
|
|
||||||
queryParams.set("uploader", filter.uploader);
|
|
||||||
}
|
|
||||||
const response = await fetch("/fragments/demo-list?" + queryParams);
|
|
||||||
document.querySelector('.demolist tbody').innerHTML = await response.text();
|
document.querySelector('.demolist tbody').innerHTML = await response.text();
|
||||||
|
}
|
||||||
|
|
||||||
|
const more = async (api, demoListBody, filter) => {
|
||||||
|
const rows = demoListBody.querySelectorAll('tr');
|
||||||
|
const lastId = rows[rows.length-1].dataset.id;
|
||||||
|
|
||||||
|
const query = queryForFilter(filter);
|
||||||
|
query.set("before", lastId)
|
||||||
|
const response = await fetch("/fragments/demo-list?" + query);
|
||||||
|
const appendBody = document.createElement('tbody');
|
||||||
|
appendBody.innerHTML = await response.text();
|
||||||
|
const fragment = document.createDocumentFragment();
|
||||||
|
while (appendBody.children.length > 0) {
|
||||||
|
fragment.appendChild(appendBody.children[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
demoListBody.appendChild(fragment);
|
||||||
}
|
}
|
||||||
|
|
@ -66,4 +66,16 @@ export interface FilterSet {
|
||||||
map: string,
|
map: string,
|
||||||
players: SteamUser[],
|
players: SteamUser[],
|
||||||
uploader: string,
|
uploader: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
export function queryForFilter(filter: FilterSet): URLSearchParams {
|
||||||
|
let queryParams = new URLSearchParams({
|
||||||
|
players: filter.players.map(player => player.steamid).join(','),
|
||||||
|
mode: (filter.mode || "").toLowerCase(),
|
||||||
|
map: filter.map || "",
|
||||||
|
});
|
||||||
|
if (filter.uploader) {
|
||||||
|
queryParams.set("uploader", filter.uploader);
|
||||||
|
}
|
||||||
|
return queryParams;
|
||||||
}
|
}
|
||||||
|
|
@ -9,7 +9,7 @@ impl Render for DemoList<'_> {
|
||||||
fn render(&self) -> Markup {
|
fn render(&self) -> Markup {
|
||||||
html! {
|
html! {
|
||||||
@for demo in self.demos {
|
@for demo in self.demos {
|
||||||
tr {
|
tr data-id = (demo.id) {
|
||||||
td .title {
|
td .title {
|
||||||
a href = (demo.url()) { (demo.server) " - " (demo.red) " vs " (demo.blu) }
|
a href = (demo.url()) { (demo.server) " - " (demo.red) " vs " (demo.blu) }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ impl Page for Index<'_> {
|
||||||
(self.demo_list())
|
(self.demo_list())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
button #load-more { "Load more.." }
|
||||||
script defer src = (script) type = "text/javascript" {}
|
script defer src = (script) type = "text/javascript" {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ impl Page for Profile<'_> {
|
||||||
(self.demo_list())
|
(self.demo_list())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
button #load-more { "Load more.." }
|
||||||
script defer src = (script) type = "text/javascript" {}
|
script defer src = (script) type = "text/javascript" {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ impl Page for Uploads<'_> {
|
||||||
(self.demo_list())
|
(self.demo_list())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
button #load-more { "Load more.." }
|
||||||
script defer src = (script) type = "text/javascript" {}
|
script defer src = (script) type = "text/javascript" {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
width: 180px;
|
width: 180px;
|
||||||
}
|
}
|
||||||
|
|
||||||
& tr:nth-child(even) {
|
& tr:nth-child(odd) {
|
||||||
background-color: var(--primary-color-accent);
|
background-color: var(--primary-color-accent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -72,6 +72,18 @@
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#load-more {
|
||||||
|
background-color: var(--primary-color-accent);
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
line-height: 30px;
|
||||||
|
text-align: center;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 950px) {
|
@media (max-width: 950px) {
|
||||||
.demolist .format {
|
.demolist .format {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue