feat: improve admin pagination controls

This commit is contained in:
3252a8
2026-06-07 23:03:03 +03:00
parent bddcd16a07
commit d1c4a6de80
8 changed files with 379 additions and 63 deletions
@@ -105,6 +105,10 @@
if (index >= 0) backupsPage = Math.floor(index / BACKUPS_PAGE_SIZE);
}
function setBackupsPage(page) {
backupsPage = Math.min(Math.max(0, Number(page) || 0), backupsPageCount - 1);
}
function warningsText(warnings) {
return (warnings || []).filter(Boolean).join("\n");
}
@@ -336,12 +340,16 @@
{#if totalArchives > BACKUPS_PAGE_SIZE}
<AdminPagination
meta={paginationMeta()}
page={backupsPage}
pageCount={backupsPageCount}
pageLabel={at("page_short", {}, "Стр.")}
ofLabel={at("pagination_of", {}, "из")}
jumpLabel={at("page_short", {}, "Стр.")}
jumpAriaLabel={at("pagination_jump_aria", {}, "Перейти к странице")}
goLabel={at("pagination_go", {}, "Перейти")}
prevLabel={at("pagination_prev", {}, "Назад")}
nextLabel={at("pagination_next", {}, "Далее")}
prevDisabled={backupsPage <= 0}
nextDisabled={backupsPage >= backupsPageCount - 1}
onPrev={() => (backupsPage = Math.max(0, backupsPage - 1))}
onNext={() => (backupsPage = Math.min(backupsPageCount - 1, backupsPage + 1))}
onPageChange={setBackupsPage}
/>
{/if}
{/if}
+12 -10
View File
@@ -15,10 +15,11 @@
export let onOpenUserCard = () => {};
const logsStore = getContext("logsStore");
const LOGS_PAGE_SIZE = 50;
$: ({ logs, logsTotal, logsPage, logsUserFilter, logsLoading } = $logsStore);
$: logsHasMore = logs.length > 0 && logsTotal > (logsPage + 1) * 50; // 50 is LOGS_PAGE_SIZE
$: logsPageCount = Math.max(1, Math.ceil(Number(logsTotal || 0) / LOGS_PAGE_SIZE));
$: logHeaders = [
at("date", {}, "Дата"),
at("event", {}, "Событие"),
@@ -165,17 +166,18 @@
</div>
<AdminPagination
meta={`${at("page_short", {}, "Стр.")} ${logsPage + 1}`}
page={logsPage}
pageCount={logsPageCount}
total={logsTotal}
pageLabel={at("page_short", {}, "Стр.")}
ofLabel={at("pagination_of", {}, "из")}
totalLabel={at("total", {}, "Всего")}
jumpLabel={at("page_short", {}, "Стр.")}
jumpAriaLabel={at("pagination_jump_aria", {}, "Перейти к странице")}
goLabel={at("pagination_go", {}, "Перейти")}
prevLabel={at("back", {}, "Назад")}
nextLabel={at("next", {}, "Далее")}
prevDisabled={logsPage === 0}
nextDisabled={!logsHasMore}
onPrev={() => {
logsStore.setPage(Math.max(0, logsPage - 1));
}}
onNext={() => {
logsStore.setPage(logsPage + 1);
}}
onPageChange={(page) => logsStore.setPage(page)}
/>
<style>
@@ -17,10 +17,11 @@
export let onOpenUserCard = () => {};
const paymentsStore = getContext("paymentsStore");
const PAYMENTS_PAGE_SIZE = 25;
$: ({ payments, paymentsTotal, paymentsPage, paymentsLoading } = $paymentsStore);
$: paymentsHasMore = payments.length > 0 && paymentsTotal > (paymentsPage + 1) * 25; // 25 is PAYMENTS_PAGE_SIZE
$: paymentsPageCount = Math.max(1, Math.ceil(Number(paymentsTotal || 0) / PAYMENTS_PAGE_SIZE));
/** @param {number|null|undefined} v */
function formatTrafficGbCell(v) {
@@ -177,17 +178,18 @@
</div>
<AdminPagination
meta={`${at("page_short", {}, "Стр.")} ${paymentsPage + 1} · ${at("total", {}, "Всего")} ${paymentsTotal}`}
page={paymentsPage}
pageCount={paymentsPageCount}
total={paymentsTotal}
pageLabel={at("page_short", {}, "Стр.")}
ofLabel={at("pagination_of", {}, "из")}
totalLabel={at("total", {}, "Всего")}
jumpLabel={at("page_short", {}, "Стр.")}
jumpAriaLabel={at("pagination_jump_aria", {}, "Перейти к странице")}
goLabel={at("pagination_go", {}, "Перейти")}
prevLabel={at("back", {}, "Назад")}
nextLabel={at("next", {}, "Далее")}
prevDisabled={paymentsPage === 0}
nextDisabled={!paymentsHasMore}
onPrev={() => {
paymentsStore.setPage(Math.max(0, paymentsPage - 1));
}}
onNext={() => {
paymentsStore.setPage(paymentsPage + 1);
}}
onPageChange={(page) => paymentsStore.setPage(page)}
/>
<style>
@@ -129,11 +129,14 @@
userLogsPageSize,
} = $usersStore);
$: userLogsHasMore =
Number(userLogsTotal || 0) > (Number(userLogsPage || 0) + 1) * Number(userLogsPageSize || 20);
$: userReferralsHasMore =
Number(userReferralsTotal || 0) >
(Number(userReferralsPage || 0) + 1) * Number(userReferralsPageSize || 25);
$: userLogsPageCount = Math.max(
1,
Math.ceil(Number(userLogsTotal || 0) / Number(userLogsPageSize || 20))
);
$: userReferralsPageCount = Math.max(
1,
Math.ceil(Number(userReferralsTotal || 0) / Number(userReferralsPageSize || 25))
);
$: openedUserAvatarUrl = openedUser ? resolvedAvatarUrl(openedUser) : "";
$: referralInviter = openedUserDetail?.referral?.inviter || null;
@@ -738,13 +741,19 @@
{#if userLogsLoaded && userLogsTotal > userLogsPageSize}
<AdminPagination
meta={`${at("page_short", {}, "Стр.")} ${userLogsPage + 1}`}
page={userLogsPage}
pageCount={userLogsPageCount}
total={userLogsTotal}
pageLabel={at("page_short", {}, "Стр.")}
ofLabel={at("pagination_of", {}, "из")}
totalLabel={at("total", {}, "Всего")}
jumpLabel={at("page_short", {}, "Стр.")}
jumpAriaLabel={at("pagination_jump_aria", {}, "Перейти к странице")}
goLabel={at("pagination_go", {}, "Перейти")}
prevLabel={at("back", {}, "Назад")}
nextLabel={at("next", {}, "Далее")}
prevDisabled={userLogsPage === 0 || userLogsLoading}
nextDisabled={!userLogsHasMore || userLogsLoading}
onPrev={() => usersStore.setUserLogsPage(Math.max(0, userLogsPage - 1))}
onNext={() => usersStore.setUserLogsPage(userLogsPage + 1)}
disabled={userLogsLoading}
onPageChange={(page) => usersStore.setUserLogsPage(page)}
/>
{/if}
</Tabs.Content>
@@ -1244,20 +1253,19 @@
{#if userReferralsTotal > userReferralsPageSize}
<AdminPagination
meta={at(
"pagination_meta",
{
current: userReferralsPage + 1,
total: Math.max(1, Math.ceil(userReferralsTotal / userReferralsPageSize)),
},
`${userReferralsPage + 1}/${Math.max(1, Math.ceil(userReferralsTotal / userReferralsPageSize))}`
)}
page={userReferralsPage}
pageCount={userReferralsPageCount}
total={userReferralsTotal}
pageLabel={at("page_short", {}, "Стр.")}
ofLabel={at("pagination_of", {}, "из")}
totalLabel={at("total", {}, "Всего")}
jumpLabel={at("page_short", {}, "Стр.")}
jumpAriaLabel={at("pagination_jump_aria", {}, "Перейти к странице")}
goLabel={at("pagination_go", {}, "Перейти")}
prevLabel={at("prev_page", {}, "Назад")}
nextLabel={at("next_page", {}, "Вперёд")}
prevDisabled={userReferralsLoading || userReferralsPage <= 0}
nextDisabled={userReferralsLoading || !userReferralsHasMore}
onPrev={() => usersStore.setUserReferralsPage(userReferralsPage - 1)}
onNext={() => usersStore.setUserReferralsPage(userReferralsPage + 1)}
disabled={userReferralsLoading}
onPageChange={(page) => usersStore.setUserReferralsPage(page)}
/>
{/if}
</div>
+12 -10
View File
@@ -48,7 +48,7 @@
const USERS_PAGE_SIZE = 25;
let usersFilterSheetOpen = false;
$: usersHasMore = users.length === USERS_PAGE_SIZE;
$: usersPageCount = Math.max(1, Math.ceil(Number(usersTotal || 0) / USERS_PAGE_SIZE));
const USERS_FILTER_OPTIONS = [
{ value: "all", label: at("filter_all", {}, "Все") },
@@ -570,17 +570,19 @@
</div>
<AdminPagination
meta={`${at("page", {}, "Страница")} ${usersPage + 1}`}
page={usersPage}
pageCount={usersPageCount}
total={usersTotal}
pageLabel={at("page_short", {}, "Стр.")}
ofLabel={at("pagination_of", {}, "из")}
totalLabel={at("total", {}, "Всего")}
jumpLabel={at("page_short", {}, "Стр.")}
jumpAriaLabel={at("pagination_jump_aria", {}, "Перейти к странице")}
goLabel={at("pagination_go", {}, "Перейти")}
prevLabel={at("back", {}, "Назад")}
nextLabel={at("next", {}, "Далее")}
prevDisabled={usersPage === 0}
nextDisabled={!usersHasMore}
onPrev={() => {
usersStore.updateState({ usersPage: Math.max(0, usersPage - 1) });
usersStore.loadUsers();
}}
onNext={() => {
usersStore.updateState({ usersPage: usersPage + 1 });
onPageChange={(page) => {
usersStore.updateState({ usersPage: page });
usersStore.loadUsers();
}}
/>