{{ inbound.port }}
{{ inbound.name }}
-
-
-
@@ -842,16 +850,21 @@ const complete = computed(
cursor: pointer;
}
-.acts button:hover {
+.acts button:hover:not(:disabled) {
border-color: var(--c-accent);
color: var(--c-accent-text);
}
-.acts button.danger:hover {
+.acts button.danger:hover:not(:disabled) {
border-color: var(--c-danger);
color: var(--c-danger);
}
+.acts button:disabled {
+ color: var(--c-text-faint);
+ cursor: not-allowed;
+}
+
.facts {
display: grid;
grid-template-columns: auto 1fr;
diff --git a/web/views/RouterPage.vue b/web/views/RouterPage.vue
index 7205093..84be55c 100644
--- a/web/views/RouterPage.vue
+++ b/web/views/RouterPage.vue
@@ -22,6 +22,7 @@ import {
sharedPeers,
syncGenerated,
readSetup,
+ upgradeLegacyInbound,
userProviders,
} from '@shared/inbound-groups.ts'
import { missingLanRules, moveRule, ruleProvidersOf } from '@shared/rules.ts'
@@ -177,6 +178,30 @@ async function adopt() {
await commit(applySetup(clone(), target.name, defaultSetup()), `${target.name} 已改为逐条选线路`)
}
+/** 待确认升级的那一路 legacy 入站。非 null 时确认对话框打开着。 */
+const upgrading = ref
(null)
+
+function askUpgrade() {
+ const target = selected.value
+ if (!target || target.legacyKey === null || saving.value) return
+ upgrading.value = target
+}
+
+async function upgradeConfirmed() {
+ const target = upgrading.value
+ upgrading.value = null
+ if (!target || saving.value) return
+ const next = upgradeLegacyInbound(clone(), target)
+ if (!next) {
+ toast(`已有名为 ${target.name} 的入站,无法升级`, { kind: 'error' })
+ return
+ }
+ // 新入站追加在 listeners 末尾,升级成功后把选中跟过去,否则选中会被重置到第一行
+ const index = Array.isArray(props.data.listeners) ? props.data.listeners.length : 0
+ const ok = await commit(next, `${target.name} 已改为命名入站`)
+ if (ok) selectedId.value = `listener:${String(index)}`
+}
+
function openAdd() {
formEditing.value = null
formOpen.value = true
@@ -368,6 +393,7 @@ async function removeConfirmed() {
:saving="saving"
@edit="openEdit"
@remove="askRemove"
+ @upgrade="askUpgrade"
@select="selectMember"
@test="test"
@save="saveSetup"
@@ -400,6 +426,19 @@ async function removeConfirmed() {
@confirm="removeConfirmed"
/>
+
+