From 89a8f549f2d00b53111ce068a5b6075d912e6def Mon Sep 17 00:00:00 2001 From: Abdalrahman Date: Tue, 12 May 2026 12:29:32 +0300 Subject: [PATCH 01/32] feat: sortable inbounds table columns (#4300) --- frontend/src/pages/inbounds/InboundList.vue | 80 +++++++++++++++++---- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/frontend/src/pages/inbounds/InboundList.vue b/frontend/src/pages/inbounds/InboundList.vue index 88b39bc8..c425ced5 100644 --- a/frontend/src/pages/inbounds/InboundList.vue +++ b/frontend/src/pages/inbounds/InboundList.vue @@ -1,5 +1,5 @@ + + diff --git a/frontend/src/pages/inbounds/InboundsPage.vue b/frontend/src/pages/inbounds/InboundsPage.vue index 5a4915f0..de02fe16 100644 --- a/frontend/src/pages/inbounds/InboundsPage.vue +++ b/frontend/src/pages/inbounds/InboundsPage.vue @@ -21,6 +21,7 @@ import InboundList from './InboundList.vue'; import InboundFormModal from './InboundFormModal.vue'; import ClientFormModal from './ClientFormModal.vue'; import ClientBulkModal from './ClientBulkModal.vue'; +import CopyClientsModal from './CopyClientsModal.vue'; import InboundInfoModal from './InboundInfoModal.vue'; import QrCodeModal from './QrCodeModal.vue'; import TextModal from '@/components/TextModal.vue'; @@ -88,6 +89,8 @@ const clientIndex = ref(null); const bulkOpen = ref(false); const bulkDbInbound = ref(null); +const copyOpen = ref(false); +const copyDbInbound = ref(null); // === Info / QR-code modals =========================================== const infoOpen = ref(false); @@ -515,10 +518,8 @@ function onRowAction({ key, dbInbound }) { exportInboundClipboard(dbInbound); break; case 'copyClients': - // Copy-clients-from-inbound is a tiny dedicated modal in legacy - // (lets you tick clients to copy across inbounds). Defer to a - // future commit — surface a friendly message for now. - message.info('Copy clients across inbounds — coming soon'); + copyDbInbound.value = dbInbound; + copyOpen.value = true; break; case 'delete': confirmDelete(dbInbound); @@ -663,6 +664,8 @@ function onRowAction({ key, dbInbound }) { :ip-limit-enable="ipLimitEnable" :traffic-diff="trafficDiff" @saved="refresh" /> + Date: Tue, 12 May 2026 12:34:22 +0200 Subject: [PATCH 05/32] fix(api-docs): copy API token button --- frontend/src/pages/api-docs/ApiDocsPage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/api-docs/ApiDocsPage.vue b/frontend/src/pages/api-docs/ApiDocsPage.vue index f749cd14..28fee7b4 100644 --- a/frontend/src/pages/api-docs/ApiDocsPage.vue +++ b/frontend/src/pages/api-docs/ApiDocsPage.vue @@ -64,7 +64,7 @@ function regenerateApiToken() { async function copyApiToken() { if (!apiToken.value) return; - const ok = await ClipboardManager.copy(apiToken.value); + const ok = await ClipboardManager.copyText(apiToken.value); if (ok) message.success(t('success')); } From 07bc74a5210027bbdc9e86938e1b204385eacfa5 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Tue, 12 May 2026 12:38:38 +0200 Subject: [PATCH 06/32] feat(nodes): blur address column with eye-toggle, mirroring IndexPage IP card --- frontend/src/pages/nodes/NodeList.vue | 47 ++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/frontend/src/pages/nodes/NodeList.vue b/frontend/src/pages/nodes/NodeList.vue index 4deaa85c..bd84ecec 100644 --- a/frontend/src/pages/nodes/NodeList.vue +++ b/frontend/src/pages/nodes/NodeList.vue @@ -1,5 +1,5 @@ + + + + + + diff --git a/frontend/src/pages/api-docs/EndpointRow.vue b/frontend/src/pages/api-docs/EndpointRow.vue index 0b7fb300..761e4a88 100644 --- a/frontend/src/pages/api-docs/EndpointRow.vue +++ b/frontend/src/pages/api-docs/EndpointRow.vue @@ -1,6 +1,7 @@