diff --git a/frontend/src/pages/inbounds/ClientRowTable.vue b/frontend/src/pages/inbounds/ClientRowTable.vue index eaaa4255..345e0b35 100644 --- a/frontend/src/pages/inbounds/ClientRowTable.vue +++ b/frontend/src/pages/inbounds/ClientRowTable.vue @@ -407,7 +407,7 @@ function rowKey(client) { 80px /* online */ minmax(160px, 2fr) /* client identity */ minmax(160px, 2fr) /* traffic */ - 90px /* all-time */ + 130px /* all-time */ 140px; /* expiry */ gap: 12px; align-items: center; diff --git a/frontend/src/pages/inbounds/InboundFormModal.vue b/frontend/src/pages/inbounds/InboundFormModal.vue index fb38f197..133e0767 100644 --- a/frontend/src/pages/inbounds/InboundFormModal.vue +++ b/frontend/src/pages/inbounds/InboundFormModal.vue @@ -140,6 +140,25 @@ const canEnableTls = computed(() => inbound.value?.canEnableTls?.() === true); const canEnableReality = computed(() => inbound.value?.canEnableReality?.() === true); const canEnableTlsFlow = computed(() => inbound.value?.canEnableTlsFlow?.() === true); +// VLESS/Trojan TLS fallbacks — surfaced in the protocol tab when the +// inbound is on TCP and (for VLESS) using no Xray-side encryption. +const showFallbacks = computed(() => { + if (!inbound.value) return false; + if (inbound.value.stream?.network !== 'tcp') return false; + if (inbound.value.protocol === Protocols.VLESS) { + const enc = inbound.value.settings?.encryption; + return !enc || enc === 'none'; + } + return inbound.value.protocol === Protocols.TROJAN; +}); + +function addFallback() { + inbound.value?.settings?.addFallback?.(); +} +function delFallback(idx) { + inbound.value?.settings?.delFallback?.(idx); +} + // Date / GB bridges (legacy used moment via _expiryTime; we go direct). const expiryDate = computed({ get: () => (dbForm.value?.expiryTime > 0 ? dayjs(dbForm.value.expiryTime) : null), @@ -867,6 +886,107 @@ watch( + + + @@ -1623,6 +1743,17 @@ watch( border-bottom: 1px solid rgba(128, 128, 128, 0.15); } +.fallbacks-header { + display: flex; + align-items: center; + gap: 8px; + margin: 8px 0; +} +.fallbacks-title { + font-weight: 500; + flex: 1; +} + .wg-peer { margin-top: 4px; } diff --git a/frontend/src/pages/inbounds/InboundInfoModal.vue b/frontend/src/pages/inbounds/InboundInfoModal.vue index 2abe1e01..66015582 100644 --- a/frontend/src/pages/inbounds/InboundInfoModal.vue +++ b/frontend/src/pages/inbounds/InboundInfoModal.vue @@ -1,7 +1,7 @@