Implement PlaceholderHelp component across various forms for enhanced user guidance

- Integrated PlaceholderHelp component into multiple forms including WelcomeForm, TagsManager, and StatsForm to provide contextual hints for available placeholders.
- Updated DiscordEmbedBuilder to support placeholder presets, improving user experience when creating embeds.
- Enhanced localization files to include new placeholder descriptions, ensuring clarity in both English and German.
- Refactored related components to maintain consistency in placeholder handling across the application.
This commit is contained in:
TheOnlyMace
2026-07-22 22:07:08 +02:00
parent 55a4f7bf09
commit 8cfb149a18
21 changed files with 583 additions and 98 deletions

View File

@@ -0,0 +1,80 @@
export type PlaceholderPresetId =
| 'welcome'
| 'welcomeDm'
| 'tags'
| 'birthdays'
| 'leveling'
| 'tempvoice'
| 'stats'
| 'feeds'
| 'scheduler'
| 'channelMention';
export interface PlaceholderDefinition {
/** Exact token to insert/copy, e.g. `{user}` or `["123…"]`. */
token: string;
/** i18n key under `placeholders.desc.*`. */
descriptionKey: string;
}
const CHANNEL_MENTIONS: PlaceholderDefinition[] = [
{
token: '["123456789012345678"]',
descriptionKey: 'placeholders.desc.channelBracket'
},
{
token: '<#123456789012345678>',
descriptionKey: 'placeholders.desc.channelNative'
}
];
const USER_SERVER: PlaceholderDefinition[] = [
{ token: '{user}', descriptionKey: 'placeholders.desc.userMention' },
{ token: '{user.name}', descriptionKey: 'placeholders.desc.userName' },
{ token: '{user.tag}', descriptionKey: 'placeholders.desc.userTag' },
{ token: '{user.id}', descriptionKey: 'placeholders.desc.userId' },
{ token: '{server}', descriptionKey: 'placeholders.desc.server' },
{ token: '{memberCount}', descriptionKey: 'placeholders.desc.memberCount' }
];
/**
* Placeholders that actually work in each dashboard field context.
* Keep this list in sync with the bot renderers.
*/
export const PLACEHOLDER_PRESETS: Record<PlaceholderPresetId, PlaceholderDefinition[]> = {
welcome: [...USER_SERVER, ...CHANNEL_MENTIONS],
welcomeDm: [...USER_SERVER, ...CHANNEL_MENTIONS],
tags: [
{ token: '{user}', descriptionKey: 'placeholders.desc.userMention' },
{ token: '{user.name}', descriptionKey: 'placeholders.desc.userName' },
{ token: '{user.tag}', descriptionKey: 'placeholders.desc.userTag' },
{ token: '{user.id}', descriptionKey: 'placeholders.desc.userId' },
{ token: '{server}', descriptionKey: 'placeholders.desc.server' },
{ token: '{args}', descriptionKey: 'placeholders.desc.args' },
{ token: '{random:a|b|c}', descriptionKey: 'placeholders.desc.random' },
...CHANNEL_MENTIONS
],
birthdays: [
{ token: '{user}', descriptionKey: 'placeholders.desc.userMention' },
{ token: '{user.name}', descriptionKey: 'placeholders.desc.userName' },
{ token: '{user.tag}', descriptionKey: 'placeholders.desc.userTag' },
{ token: '{age}', descriptionKey: 'placeholders.desc.age' }
],
leveling: [
{ token: '{user}', descriptionKey: 'placeholders.desc.userMention' },
{ token: '{username}', descriptionKey: 'placeholders.desc.username' },
{ token: '{level}', descriptionKey: 'placeholders.desc.level' }
],
tempvoice: [
{ token: '{user}', descriptionKey: 'placeholders.desc.userDisplayName' },
{ token: '{user.name}', descriptionKey: 'placeholders.desc.userName' },
{ token: '{user.tag}', descriptionKey: 'placeholders.desc.userTagPlain' }
],
stats: [{ token: '{count}', descriptionKey: 'placeholders.desc.count' }],
feeds: [
{ token: '{title}', descriptionKey: 'placeholders.desc.feedTitle' },
{ token: '{url}', descriptionKey: 'placeholders.desc.feedUrl' }
],
scheduler: [...CHANNEL_MENTIONS],
channelMention: [...CHANNEL_MENTIONS]
};