feat: UX improvements — secure webhooks, locale fixes, dynamic languages, UI polish

- Remove top paginator from dashboard events, keep only bottom
- Fix test message locale: pass UI locale to email/matrix bot tests
- Convert webhook auth mode from text input to icon grid selector
- Generate secure UUID tokens for webhook URLs instead of sequential IDs
- Move Recent Payloads into per-provider expandable container (lazy-loaded)
- Make template config languages dynamic via app settings instead of hardcoded
- Change default dev port to 5175
This commit is contained in:
2026-04-11 02:14:15 +03:00
parent 6b2211353d
commit 734e5c9340
29 changed files with 278 additions and 154 deletions
@@ -4,7 +4,7 @@
import { api } from '$lib/api';
import { t } from '$lib/i18n';
import { sanitizePreview } from '$lib/sanitize';
import { templateConfigsCache, capabilitiesCache } from '$lib/stores/caches.svelte';
import { templateConfigsCache, capabilitiesCache, supportedLocalesCache } from '$lib/stores/caches.svelte';
import PageHeader from '$lib/components/PageHeader.svelte';
import Card from '$lib/components/Card.svelte';
import Loading from '$lib/components/Loading.svelte';
@@ -57,7 +57,7 @@
let slotFilter = $state('');
let showPreviewFor = $state<Set<string>>(new Set());
const LOCALES = ['en', 'ru'] as const;
let LOCALES = $derived(supportedLocalesCache.items);
let activeLocale = $state<string>('en');
function toggleSlot(key: string) {
@@ -202,6 +202,7 @@
templateConfigsCache.fetch(true),
api('/template-configs/variables'),
capabilitiesCache.fetch(),
supportedLocalesCache.fetch(),
]);
} catch (err: any) { error = err.message || t('common.loadError'); snackError(error); }
finally { loaded = true; highlightFromUrl(); }