@@ -512,6 +512,8 @@ function updateAdminNav() {
512512 } ) ;
513513}
514514
515+ let adminServersPage = 1 ;
516+
515517async function renderAdminServers ( ) {
516518 document . querySelectorAll ( '.admin-page' ) . forEach ( p => p . classList . remove ( 'active' ) ) ;
517519 const el = $a ( '#admin-page-servers' ) ;
@@ -538,16 +540,27 @@ async function renderAdminServers() {
538540 <tr><td colspan="6" style="text-align:center;padding:32px;color:var(--text-secondary)"><span class="spinner"></span> Loading...</td></tr>
539541 </tbody>
540542 </table>
543+ <div id="admin-servers-pagination" style="display:none"></div>
541544 </div>
542545 ` ;
543546
547+ await fetchAdminServers ( adminServersPage ) ;
548+ }
549+
550+ async function fetchAdminServers ( pageNum ) {
551+ pageNum = pageNum || 1 ;
552+ const limit = 10 ;
553+ const offset = ( pageNum - 1 ) * limit ;
554+ const paginationEl = $a ( '#admin-servers-pagination' ) ;
555+
544556 try {
545- const data = await adminApi ( ' /servers' ) ;
557+ const data = await adminApi ( ` /servers?limit= ${ limit } &offset= ${ offset } ` ) ;
546558 const tbody = $a ( '#admin-servers-tbody' ) ;
547559 if ( ! tbody ) return ;
548560
549561 if ( data . servers . length === 0 ) {
550562 tbody . innerHTML = '<tr><td colspan="6" style="text-align:center;padding:32px;color:var(--text-secondary)">No servers found.</td></tr>' ;
563+ if ( paginationEl ) paginationEl . style . display = 'none' ;
551564 return ;
552565 }
553566
@@ -574,13 +587,31 @@ async function renderAdminServers() {
574587 </tr>
575588 ` ;
576589 } ) . join ( '' ) ;
590+
591+ if ( data . totalPages > 1 ) {
592+ paginationEl . innerHTML = ahtml `
593+ <div class="log-pagination">
594+ <button class="btn btn-ghost btn-sm" onclick="changeAdminServersPage(${ pageNum - 1 } )" ${ pageNum <= 1 ? 'disabled' : '' } >Previous</button>
595+ <span class="log-pagination-info">Page ${ data . page } of ${ data . totalPages } (${ data . total } total)</span>
596+ <button class="btn btn-ghost btn-sm" onclick="changeAdminServersPage(${ pageNum + 1 } )" ${ pageNum >= data . totalPages ? 'disabled' : '' } >Next</button>
597+ </div>
598+ ` ;
599+ paginationEl . style . display = '' ;
600+ } else {
601+ paginationEl . style . display = 'none' ;
602+ }
577603 } catch ( err ) {
578604 const tbody = $a ( '#admin-servers-tbody' ) ;
579605 if ( tbody ) tbody . innerHTML = `<tr><td colspan="6" style="text-align:center;padding:32px;color:var(--accent-red)">Error: ${ err . message } </td></tr>` ;
580606 }
581607 initIcons ( ) ;
582608}
583609
610+ function changeAdminServersPage ( pageNum ) {
611+ adminServersPage = pageNum ;
612+ fetchAdminServers ( pageNum ) ;
613+ }
614+
584615async function renderAdminServerDetail ( serverId ) {
585616 document . querySelectorAll ( '.admin-page' ) . forEach ( p => p . classList . remove ( 'active' ) ) ;
586617 const detailPage = $a ( '#admin-page-server-detail' ) ;
0 commit comments