feat(users): кнопка «Отправить сообщение» в карточке пользователя

Паритет с бот-кнопкой «✉️ Отправить сообщение»: в блоке действий карточки
юзера появляется кнопка (RBAC users:send_message), открывающая модалку с
текстом (HTML, лимит 4096) — бот отправляет юзеру прямое сообщение через
POST /admin/users/{id}/send-message.

Для email-only юзеров без telegram_id кнопка задизейблена с подсказкой;
коды ошибок бэкенда (no_telegram_id / forbidden / bad_request) маппятся
в честные локализованные сообщения. Локали ru/en/fa/zh.
This commit is contained in:
Case211
2026-07-14 07:28:33 +05:00
parent d7ea3c0635
commit 2f743d82db
6 changed files with 164 additions and 5 deletions

View File

@@ -3342,6 +3342,20 @@
"confirm": {
"block": "Block this user?"
},
"sendMessage": {
"button": "✉️ Send message",
"title": "Send message to user",
"placeholder": "Text the bot will send to the user (HTML supported)",
"send": "Send",
"sending": "Sending...",
"success": "Message sent to user",
"noTelegram": "This user is registered by email only and cannot receive Telegram messages",
"errors": {
"no_telegram_id": "This user is registered by email only and cannot receive Telegram messages",
"forbidden": "The user has blocked the bot or cannot receive messages",
"bad_request": "Telegram rejected the message. Check the text (HTML markup) and try again"
}
},
"userActions": {
"delete": "Delete user",
"resetTrial": "Reset trial",

View File

@@ -3153,6 +3153,20 @@
},
"notFound": "کاربر یافت نشد",
"purchaseCount": "تعداد خرید: {{count}}",
"sendMessage": {
"button": "✉️ ارسال پیام",
"title": "ارسال پیام به کاربر",
"placeholder": "متنی که ربات برای کاربر ارسال می‌کند (HTML پشتیبانی می‌شود)",
"send": "ارسال",
"sending": "در حال ارسال...",
"success": "پیام برای کاربر ارسال شد",
"noTelegram": "این کاربر فقط با ایمیل ثبت‌نام کرده و نمی‌تواند پیام تلگرام دریافت کند",
"errors": {
"no_telegram_id": "این کاربر فقط با ایمیل ثبت‌نام کرده و نمی‌تواند پیام تلگرام دریافت کند",
"forbidden": "کاربر ربات را مسدود کرده یا نمی‌تواند پیام دریافت کند",
"bad_request": "تلگرام پیام را رد کرد. متن (نشانه‌گذاری HTML) را بررسی کرده و دوباره تلاش کنید"
}
},
"userActions": {
"delete": "حذف کاربر",
"disable": "غیرفعال‌سازی",

View File

@@ -3749,6 +3749,20 @@
"confirm": {
"block": "Заблокировать пользователя?"
},
"sendMessage": {
"button": "✉️ Отправить сообщение",
"title": "Отправка сообщения пользователю",
"placeholder": "Текст, который бот отправит пользователю (поддерживается HTML)",
"send": "Отправить",
"sending": "Отправка...",
"success": "Сообщение отправлено пользователю",
"noTelegram": "Пользователь зарегистрирован только по email и не может получать сообщения в Telegram",
"errors": {
"no_telegram_id": "Пользователь зарегистрирован только по email и не может получать сообщения в Telegram",
"forbidden": "Пользователь заблокировал бота или не может получать сообщения",
"bad_request": "Telegram отклонил сообщение. Проверьте текст (HTML-разметку) и попробуйте ещё раз"
}
},
"userActions": {
"delete": "Удалить пользователя",
"resetTrial": "Сбросить триал",

View File

@@ -3152,6 +3152,20 @@
},
"notFound": "未找到用户",
"purchaseCount": "购买次数:{{count}}",
"sendMessage": {
"button": "✉️ 发送消息",
"title": "向用户发送消息",
"placeholder": "机器人将发送给用户的文本(支持 HTML",
"send": "发送",
"sending": "发送中...",
"success": "消息已发送给用户",
"noTelegram": "该用户仅通过邮箱注册,无法接收 Telegram 消息",
"errors": {
"no_telegram_id": "该用户仅通过邮箱注册,无法接收 Telegram 消息",
"forbidden": "用户已屏蔽机器人或无法接收消息",
"bad_request": "Telegram 拒绝了该消息。请检查文本HTML 标记)后重试"
}
},
"userActions": {
"delete": "删除用户",
"disable": "禁用",