From 8cfb149a188bcca5ed6af1e108dd818917bcb151 Mon Sep 17 00:00:00 2001 From: TheOnlyMace <0815cracky@gmail.com> Date: Wed, 22 Jul 2026 22:07:08 +0200 Subject: [PATCH] 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. --- apps/bot/src/modules/scheduler/service.ts | 8 +- apps/bot/src/modules/welcome/events.ts | 4 +- .../src/components/modules/birthdays-form.tsx | 2 + .../src/components/modules/feeds-manager.tsx | 2 + .../src/components/modules/leveling-form.tsx | 2 + .../src/components/modules/logging-form.tsx | 178 ++++++++++++------ .../components/modules/scheduler-manager.tsx | 8 +- .../src/components/modules/stats-form.tsx | 3 +- .../src/components/modules/tags-manager.tsx | 72 +++++-- .../src/components/modules/tempvoice-form.tsx | 2 + .../src/components/modules/welcome-form.tsx | 8 +- .../components/ui/discord-embed-builder.tsx | 12 +- .../ui/discord-resource-multi-select.tsx | 13 +- .../src/components/ui/placeholder-help.tsx | 96 ++++++++++ apps/webui/src/lib/placeholder-presets.ts | 80 ++++++++ apps/webui/src/messages/de.json | 69 ++++++- apps/webui/src/messages/en.json | 69 ++++++- docs/PHASE-TRACKING.md | 27 +++ packages/shared/src/phase2.test.ts | 10 + packages/shared/src/phase2.ts | 11 +- packages/shared/src/phase4.ts | 5 +- 21 files changed, 583 insertions(+), 98 deletions(-) create mode 100644 apps/webui/src/components/ui/placeholder-help.tsx create mode 100644 apps/webui/src/lib/placeholder-presets.ts diff --git a/apps/bot/src/modules/scheduler/service.ts b/apps/bot/src/modules/scheduler/service.ts index 6c835bc..9ed8d00 100644 --- a/apps/bot/src/modules/scheduler/service.ts +++ b/apps/bot/src/modules/scheduler/service.ts @@ -5,7 +5,7 @@ import { type MessageCreateOptions, type TextChannel } from 'discord.js'; -import { WelcomeEmbedSchema, t, tf } from '@nexumi/shared'; +import { WelcomeEmbedSchema, expandBracketChannelMentions, t, tf } from '@nexumi/shared'; import type { ScheduledMessage } from '@prisma/client'; import { ensureGuild } from '../../guild.js'; import { logger } from '../../logger.js'; @@ -99,15 +99,15 @@ export function buildAnnouncementPayload(schedule: { if (embedData) { const embed = new EmbedBuilder().setColor(embedData.color ?? 0x6366f1); if (embedData.title) { - embed.setTitle(embedData.title); + embed.setTitle(expandBracketChannelMentions(embedData.title)); } if (embedData.description) { - embed.setDescription(embedData.description); + embed.setDescription(expandBracketChannelMentions(embedData.description)); } embeds.push(embed); } - const baseContent = schedule.content?.trim() ?? ''; + const baseContent = expandBracketChannelMentions(schedule.content?.trim() ?? ''); const roleMention = schedule.rolePingId ? `<@&${schedule.rolePingId}>` : ''; const content = [roleMention, baseContent].filter(Boolean).join(' ').trim(); diff --git a/apps/bot/src/modules/welcome/events.ts b/apps/bot/src/modules/welcome/events.ts index c4d04e2..a62ecb6 100644 --- a/apps/bot/src/modules/welcome/events.ts +++ b/apps/bot/src/modules/welcome/events.ts @@ -1,6 +1,6 @@ import { PermissionFlagsBits, type GuildMember } from 'discord.js'; import type { BotContext } from '../../types.js'; -import { getWelcomeConfig, resolveWelcomePayload } from './service.js'; +import { getWelcomeConfig, resolveWelcomePayload, renderWelcomeText } from './service.js'; import { sendLeaveMessage, sendWelcomeMessage } from './renderer.js'; import { logger } from '../../logger.js'; @@ -41,7 +41,7 @@ export async function handleMemberWelcome(context: BotContext, member: GuildMemb if (config.welcomeDmEnabled && config.welcomeDmContent && !member.user.bot) { await member - .send({ content: config.welcomeDmContent.replace('{user}', `<@${member.id}>`) }) + .send({ content: renderWelcomeText(config.welcomeDmContent, member, member.guild) }) .catch(() => undefined); } } diff --git a/apps/webui/src/components/modules/birthdays-form.tsx b/apps/webui/src/components/modules/birthdays-form.tsx index cccadb4..9d43985 100644 --- a/apps/webui/src/components/modules/birthdays-form.tsx +++ b/apps/webui/src/components/modules/birthdays-form.tsx @@ -9,6 +9,7 @@ import { DiscordChannelSelect } from '@/components/ui/discord-channel-select'; import { DiscordRoleSelect } from '@/components/ui/discord-role-select'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; +import { PlaceholderHelp } from '@/components/ui/placeholder-help'; import { Switch } from '@/components/ui/switch'; import { Textarea } from '@/components/ui/textarea'; import type { SettingsSaveResult } from '@/components/settings/settings-form'; @@ -87,6 +88,7 @@ export function BirthdaysForm({ guildId, initialValue }: BirthdaysFormProps) {