Enhance alias filter functionality and improve data handling in Svelte components
- Updated the alias filter logic to prevent selected aliases from disappearing during partial or empty responses. - Refactored the alias filter change handling to a dedicated function for better readability and maintainability. - Removed redundant alias filter validation in the users page to streamline the alias selection process.
This commit is contained in:
@@ -138,10 +138,15 @@
|
|||||||
summary = s.data;
|
summary = s.data;
|
||||||
fleet = f.data ?? null;
|
fleet = f.data ?? null;
|
||||||
uniqueIps = u.data ?? null;
|
uniqueIps = u.data ?? null;
|
||||||
availableAliases = collectAliases(
|
const nextAliases = collectAliases(
|
||||||
(fleet?.servers ?? []).map((x) => x.alias),
|
(fleet?.servers ?? []).map((x) => x.alias),
|
||||||
(summary?.servers ?? []).map((x) => x.alias)
|
(summary?.servers ?? []).map((x) => x.alias)
|
||||||
);
|
);
|
||||||
|
// Не сужаем список до текущего фильтра: иначе выбранный alias
|
||||||
|
// может исчезать из селекта при частичных/пустых ответах.
|
||||||
|
availableAliases = Array.from(new Set([...availableAliases, ...nextAliases])).sort((a, b) =>
|
||||||
|
a.localeCompare(b)
|
||||||
|
);
|
||||||
lastSuccessAtMs = Date.now();
|
lastSuccessAtMs = Date.now();
|
||||||
|
|
||||||
// Как бейдж «OK» в таблице: только health + system/info (без x.ok — в JSON поле ok опционально).
|
// Как бейдж «OK» в таблице: только health + system/info (без x.ok — в JSON поле ok опционально).
|
||||||
@@ -230,6 +235,11 @@
|
|||||||
await load();
|
await load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function handleAliasFilterChange(nextAlias: string) {
|
||||||
|
aliasFilter = nextAlias;
|
||||||
|
await applyAliasIfChanged(nextAlias);
|
||||||
|
}
|
||||||
|
|
||||||
let queryKey = $derived(page.url.searchParams.toString());
|
let queryKey = $derived(page.url.searchParams.toString());
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
queryKey;
|
queryKey;
|
||||||
@@ -526,10 +536,7 @@
|
|||||||
<AliasFilterSelect
|
<AliasFilterSelect
|
||||||
availableAliases={availableAliases}
|
availableAliases={availableAliases}
|
||||||
bind:value={aliasFilter}
|
bind:value={aliasFilter}
|
||||||
onValueChange={(next) => {
|
onValueChange={(next) => void handleAliasFilterChange(next)}
|
||||||
aliasFilter = next;
|
|
||||||
void applyAliasIfChanged(next);
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
<FleetRefreshInput bind:value={refreshInput} onValueChange={() => void applyControls()} />
|
<FleetRefreshInput bind:value={refreshInput} onValueChange={() => void applyControls()} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -172,7 +172,6 @@
|
|||||||
.filter((a): a is string => typeof a === 'string' && a.length > 0)
|
.filter((a): a is string => typeof a === 'string' && a.length > 0)
|
||||||
.sort((a, b) => a.localeCompare(b));
|
.sort((a, b) => a.localeCompare(b));
|
||||||
availableAliases = aliases;
|
availableAliases = aliases;
|
||||||
if (aliasFilter !== 'all' && !aliases.includes(aliasFilter)) aliasFilter = 'all';
|
|
||||||
} catch {
|
} catch {
|
||||||
availableAliases = [];
|
availableAliases = [];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user