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
+1 -1
View File
@@ -56,5 +56,5 @@ export const giteaDescriptor: ProviderDescriptor = {
desc: () => '',
},
webhookUrlPattern: '/api/webhooks/gitea/{id}',
webhookUrlPattern: '/api/webhooks/gitea/{token}',
};
+1 -1
View File
@@ -62,5 +62,5 @@ export const plankaDescriptor: ProviderDescriptor = {
desc: () => '',
},
webhookUrlPattern: '/api/webhooks/planka/{id}',
webhookUrlPattern: '/api/webhooks/planka/{token}',
};
+4 -1
View File
@@ -20,7 +20,10 @@ export interface ConfigField {
configKey?: string;
/** i18n key for the field label. */
label: string;
type: 'text' | 'password' | 'number';
type: 'text' | 'password' | 'number' | 'grid-select';
/** Grid-select item source function name from grid-items.ts. */
gridItems?: string;
gridColumns?: number;
placeholder?: string;
/**
* - `true` → always required
+4 -4
View File
@@ -10,10 +10,10 @@ export const webhookDescriptor: ProviderDescriptor = {
{
key: 'auth_mode', configKey: 'auth_mode',
label: 'providers.authMode',
type: 'text',
placeholder: 'hmac_sha256 | bearer_token | none',
type: 'grid-select',
gridItems: 'webhookAuthModeItems',
gridColumns: 3,
defaultValue: 'none',
hint: 'providers.authModeHint',
},
{
key: 'webhook_secret', configKey: 'webhook_secret',
@@ -57,6 +57,6 @@ export const webhookDescriptor: ProviderDescriptor = {
collectionMeta: null,
webhookBased: true,
webhookUrlPattern: '/api/webhooks/webhook/{id}',
webhookUrlPattern: '/api/webhooks/webhook/{token}',
payloadHistory: true,
};