feat(admin): вкладка «Активность» в карточке пользователя

Единый таймлайн действий юзера в боте и кабинете
(GET /cabinet/admin/users/{id}/activity): вертикальная лента с
иконками-кружками по типу записи, бейджи подтипов, суммы со знаком
(+зелёный / −красный), относительное время (абсолютное — в title),
чипы-фильтры по категориям (платежи, события, промо, тикеты, подарки,
рефералы, входы), счётчик StatCard и постраничная догрузка по house
load-more паттерну. Компонент самодостаточный (ActivityTab), как
TicketsTab. Переводы во всех 4 локалях; время переиспользует
admin.auditLog.time.*.

biome check, type-check и build проходят (pre-commit пропущен: biome
не установлен локально — бинарь есть только в CI).
This commit is contained in:
Fringg
2026-07-13 03:34:07 +03:00
parent c920330fa6
commit 7547b49d7a
7 changed files with 564 additions and 8 deletions

View File

@@ -3785,7 +3785,8 @@
"sync": "Синхронизация",
"tickets": "Тикеты",
"gifts": "Подарки",
"referrals": "Рефералы"
"referrals": "Рефералы",
"activity": "Активность"
},
"noTickets": "У пользователя нет тикетов",
"ticketsCount": "тикетов",
@@ -3985,6 +3986,66 @@
"searchPlaceholder": "Поиск по имени, email или Telegram ID...",
"alreadyReferred": "уже чей-то реферал",
"noUsersFound": "Пользователи не найдены"
},
"activity": {
"total": "Всего событий",
"empty": "Активности пока нет",
"filters": {
"all": "Все",
"payments": "Платежи",
"events": "События",
"promo": "Промо",
"tickets": "Тикеты",
"gifts": "Подарки",
"referrals": "Рефералы",
"logins": "Входы"
},
"types": {
"transaction": "Транзакция",
"event": "Событие",
"promocode": "Промокод",
"coupon": "Купон",
"ticket": "Тикет",
"wheel_spin": "Колесо фортуны",
"poll": "Опрос пройден",
"gift_sent": "Подарок отправлен",
"gift_received": "Подарок получен",
"referral_earning": "Реферальное начисление",
"cabinet_login": "Вход в кабинет",
"withdrawal": "Заявка на вывод"
},
"sources": {
"bot": "Бот",
"cabinet": "Кабинет"
},
"subtypes": {
"deposit": "Пополнение",
"withdrawal": "Списание",
"subscription_payment": "Оплата подписки",
"refund": "Возврат",
"failed_refund": "Неудачный возврат",
"referral_reward": "Реферальная награда",
"poll_reward": "Награда за опрос",
"gift_payment": "Оплата подарка",
"activation": "Активация",
"purchase": "Покупка",
"subscription_purchase": "Покупка подписки",
"renewal": "Продление",
"balance_topup": "Пополнение баланса",
"promo_group_change": "Смена промогруппы",
"campaign_registration": "Регистрация по кампании",
"referral_link_visit": "Переход по реф. ссылке",
"referral_registration": "Реф. регистрация",
"trial_activation": "Активация триала",
"open": "Открыт",
"answered": "Отвечен",
"pending": "Ожидает",
"closed": "Закрыт",
"redeemed": "Погашен",
"approved": "Одобрена",
"rejected": "Отклонена",
"completed": "Выполнена"
}
}
},
"notFound": "Пользователь не найден",