From f23318fbcfa926e9514d50d9e5b5e3764220ad7e Mon Sep 17 00:00:00 2001 From: yangjianbo Date: Sat, 14 Feb 2026 12:35:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20=E5=90=8C=E6=AD=A5=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=9C=AC=E5=9C=B0=E7=A7=BB=E9=99=A4=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/admin/AccountsView.vue | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/frontend/src/views/admin/AccountsView.vue b/frontend/src/views/admin/AccountsView.vue index a146130e..9994144b 100644 --- a/frontend/src/views/admin/AccountsView.vue +++ b/frontend/src/views/admin/AccountsView.vue @@ -716,12 +716,38 @@ const mergeRuntimeFields = (oldAccount: Account, updatedAccount: Account): Accou current_window_cost: updatedAccount.current_window_cost ?? oldAccount.current_window_cost, active_sessions: updatedAccount.active_sessions ?? oldAccount.active_sessions }) + +const syncPaginationAfterLocalRemoval = () => { + const nextTotal = Math.max(0, pagination.total - 1) + pagination.total = nextTotal + pagination.pages = nextTotal > 0 ? Math.ceil(nextTotal / pagination.page_size) : 0 + + const maxPage = Math.max(1, pagination.pages || 1) + let shouldReload = false + + if (pagination.page > maxPage) { + pagination.page = maxPage + shouldReload = nextTotal > 0 + } else if (nextTotal > 0) { + const displayedEnd = (pagination.page - 1) * pagination.page_size + accounts.value.length + // 当前页条目变少时,若后续还有数据则补齐,避免空页/少一条直到手动刷新。 + shouldReload = displayedEnd < nextTotal + } + + if (shouldReload) { + load().catch((error) => { + console.error('Failed to refresh accounts after local removal:', error) + }) + } +} + const patchAccountInList = (updatedAccount: Account) => { const index = accounts.value.findIndex(account => account.id === updatedAccount.id) if (index === -1) return const mergedAccount = mergeRuntimeFields(accounts.value[index], updatedAccount) if (!accountMatchesCurrentFilters(mergedAccount)) { accounts.value = accounts.value.filter(account => account.id !== mergedAccount.id) + syncPaginationAfterLocalRemoval() selIds.value = selIds.value.filter(id => id !== mergedAccount.id) if (menu.acc?.id === mergedAccount.id) { menu.show = false