Show admin save feedback and preserve custom failover actions

This commit is contained in:
2026-05-12 21:57:10 +08:00
parent a76ab941bc
commit e778fad6ed
3 changed files with 22 additions and 7 deletions
@@ -76,6 +76,8 @@ const failoverActionDefinitions = [
},
] as const;
const failoverActionValues = new Set<string>(failoverActionDefinitions.map((item) => item.value));
const failoverCategoryOptions = [
'network',
'timeout',
@@ -653,19 +655,18 @@ function defaultFailoverActions(): Record<string, unknown> {
}
function failoverCategoryRoutingGroups(allowCategories: string[], denyCategories: string[], actions: Record<string, unknown>) {
const actionSet = new Set(failoverActionDefinitions.map((item) => item.value));
const assignments = new Map<string, string>();
for (const category of cleanTags(allowCategories)) {
const rawAction = actions[category];
const action = typeof rawAction === 'string' ? rawAction : '';
assignments.set(category, actionSet.has(action as (typeof failoverActionDefinitions)[number]['value']) ? action : 'next');
assignments.set(category, failoverActionValues.has(action) ? action : 'next');
}
for (const [category, rawAction] of Object.entries(actions)) {
if (assignments.has(category)) continue;
const action = typeof rawAction === 'string' ? rawAction : '';
if (action === 'stop') {
assignments.set(category, 'deny');
} else if (actionSet.has(action as (typeof failoverActionDefinitions)[number]['value'])) {
} else if (failoverActionValues.has(action)) {
assignments.set(category, action);
}
}
@@ -708,9 +709,16 @@ function updateFailoverCategoryRouting(
knownCategories.add(category);
}
for (const [category, rawAction] of Object.entries(actions)) {
if (!knownCategories.has(category) && typeof rawAction === 'string' && rawAction !== 'next' && rawAction !== 'stop') {
nextActions[category] = rawAction;
}
const shouldPreserveCustomAction = (
!knownCategories.has(category)
&& typeof rawAction === 'string'
&& rawAction !== 'next'
&& rawAction !== 'stop'
&& !failoverActionValues.has(rawAction)
);
if (!shouldPreserveCustomAction) continue;
// Keep forward-compatible custom actions that this editor cannot render.
nextActions[category] = rawAction;
}
return {
allowCategories: cleanTags(nextAllowCategories),