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

@@ -3378,7 +3378,8 @@
"sync": "Synchronization",
"tickets": "Tickets",
"gifts": "Gifts",
"referrals": "Referrals"
"referrals": "Referrals",
"activity": "Activity"
},
"noTickets": "No tickets from this user",
"ticketsCount": "tickets",
@@ -3579,6 +3580,66 @@
"searchPlaceholder": "Search by name, email, or Telegram ID...",
"alreadyReferred": "already has referrer",
"noUsersFound": "No users found"
},
"activity": {
"total": "Total events",
"empty": "No activity yet",
"filters": {
"all": "All",
"payments": "Payments",
"events": "Events",
"promo": "Promo",
"tickets": "Tickets",
"gifts": "Gifts",
"referrals": "Referrals",
"logins": "Logins"
},
"types": {
"transaction": "Transaction",
"event": "Event",
"promocode": "Promo code",
"coupon": "Coupon",
"ticket": "Ticket",
"wheel_spin": "Fortune wheel",
"poll": "Poll completed",
"gift_sent": "Gift sent",
"gift_received": "Gift received",
"referral_earning": "Referral earning",
"cabinet_login": "Cabinet login",
"withdrawal": "Withdrawal request"
},
"sources": {
"bot": "Bot",
"cabinet": "Cabinet"
},
"subtypes": {
"deposit": "Deposit",
"withdrawal": "Charge",
"subscription_payment": "Subscription payment",
"refund": "Refund",
"failed_refund": "Failed refund",
"referral_reward": "Referral reward",
"poll_reward": "Poll reward",
"gift_payment": "Gift payment",
"activation": "Activation",
"purchase": "Purchase",
"subscription_purchase": "Subscription purchase",
"renewal": "Renewal",
"balance_topup": "Balance top-up",
"promo_group_change": "Promo group change",
"campaign_registration": "Campaign registration",
"referral_link_visit": "Referral link visit",
"referral_registration": "Referral registration",
"trial_activation": "Trial activation",
"open": "Open",
"answered": "Answered",
"pending": "Pending",
"closed": "Closed",
"redeemed": "Redeemed",
"approved": "Approved",
"rejected": "Rejected",
"completed": "Completed"
}
}
},
"notFound": "User not found",