From 9db5a1e97c7405649806cd8e6061ac64cf08e833 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Fri, 10 Apr 2026 14:13:42 +0700 Subject: [PATCH] Add user creation button and improve data loading logic - Introduced a button for creating users, which prompts the user to select a specific node before proceeding. - Enhanced data loading logic to handle scenarios where the URL changes without immediate data refresh, ensuring up-to-date information is displayed. - Added Russian translations for new UI elements to maintain localization consistency. --- web/src/routes/ips/+page.svelte | 2 ++ web/src/routes/users/+page.svelte | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) 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 +