diff --git a/web/src/routes/ips/+page.svelte b/web/src/routes/ips/+page.svelte
index 039a2ef..90218a0 100644
--- a/web/src/routes/ips/+page.svelte
+++ b/web/src/routes/ips/+page.svelte
@@ -450,6 +450,8 @@ $effect(() => {
noScroll: true,
keepFocus: true
});
+ // Страхуемся от кейсов, когда URL уже сменился, а перезапрос не стартовал.
+ await load();
}
let queryKey = $derived(page.url.searchParams.toString());
diff --git a/web/src/routes/users/+page.svelte b/web/src/routes/users/+page.svelte
index d66149e..1d53021 100644
--- a/web/src/routes/users/+page.svelte
+++ b/web/src/routes/users/+page.svelte
@@ -32,6 +32,7 @@
import FleetRefreshInput from '$lib/components/fleet/fleet-refresh-input.svelte';
import CopyIcon from '@lucide/svelte/icons/copy';
import RefreshCwIcon from '@lucide/svelte/icons/refresh-cw';
+ import PlusIcon from '@lucide/svelte/icons/plus';
import UsersIcon from '@lucide/svelte/icons/users';
import ActivityIcon from '@lucide/svelte/icons/activity';
import GlobeIcon from '@lucide/svelte/icons/globe';
@@ -128,6 +129,9 @@
noScroll: true,
keepFocus: true
});
+ // В некоторых сценариях shallow-навигации page.url обновляется не сразу,
+ // поэтому дополнительно перезапрашиваем данные по текущему фильтру.
+ await load();
}
let queryKey = $derived(page.url.searchParams.toString());
@@ -318,6 +322,14 @@ let sumActiveIps = $derived.by(() =>
}
}
+ function openCreateUser() {
+ if (!aliasFilter || aliasFilter === 'all') {
+ toast.info('Для создания выберите конкретную ноду в фильтре "Алиас".');
+ return;
+ }
+ void goto(`/servers/${encodeURIComponent(aliasFilter)}/users`);
+ }
+
function fallbackCopy(value: string) {
if (typeof document === 'undefined') return;
const ta = document.createElement('textarea');
@@ -357,6 +369,10 @@ let sumActiveIps = $derived.by(() =>
>Ссылки tg://proxy
+