From 11f602fe04b312d56ad02bd8671c576b78e4450d Mon Sep 17 00:00:00 2001 From: H-TTTTT <36735327+H-TTTTT@users.noreply.github.com> Date: Tue, 21 Jul 2026 21:50:33 +0800 Subject: [PATCH] fix(sub): preserve external link names in Clash/JSON (#6049) expandEntry cleared Name for external subscriptions and single links with empty remark, so Clash/JSON fell back to the client email. Keep each link's original name (#fragment / vmess ps); use the row remark when set. Pass remark from the client form for single external links. Fixes #6032 --- .../src/pages/clients/ClientFormModal.tsx | 13 ++++- internal/sub/external_config.go | 49 +++++++++++++++++-- internal/sub/external_config_test.go | 29 +++++++++++ 3 files changed, 85 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/clients/ClientFormModal.tsx b/frontend/src/pages/clients/ClientFormModal.tsx index daab62e8a..0534a81c7 100644 --- a/frontend/src/pages/clients/ClientFormModal.tsx +++ b/frontend/src/pages/clients/ClientFormModal.tsx @@ -48,6 +48,7 @@ const CLIENT_IP_LOG_MODAL_Z_INDEX = CLIENT_FORM_MODAL_Z_INDEX + 1; interface ExternalLinkRow { kind: 'link' | 'subscription'; value: string; + remark: string; } interface ApiMsg { @@ -138,6 +139,7 @@ function toExternalLinkRows(links: ExternalLink[] | undefined): ExternalLinkRow[ return (links || []).map((l) => ({ kind: l.kind === 'subscription' ? 'subscription' : 'link', value: l.value || '', + remark: l.remark || '', })); } @@ -207,7 +209,7 @@ export default function ClientFormModal({ const limitIpNotice = getLimitIpNotice(fail2ban, t); function addExternalLinkRow(kind: 'link' | 'subscription') { - appendExternalLink({ kind, value: '' }); + appendExternalLink({ kind, value: '', remark: '' }); } useEffect(() => { @@ -547,7 +549,7 @@ export default function ClientFormModal({ } const externalLinks: ExternalLinkInput[] = values.externalLinks - .map((r) => ({ kind: r.kind, value: r.value.trim(), remark: '' })) + .map((r) => ({ kind: r.kind, value: r.value.trim(), remark: (r.remark || '').trim() })) .filter((r) => r.value !== ''); setSubmitting(true); @@ -917,6 +919,13 @@ export default function ClientFormModal({ placeholder="vless:// · vmess:// · trojan:// · ss:// · hysteria2:// · wireguard://" /> + + +