feat: add admin traffic usage page with TanStack Table

Add AdminTrafficUsage page showing per-user traffic statistics by node
with period filtering (1/3/7/14/30d), server-side sorting, search,
pagination, and CSV export. Uses @tanstack/react-table with manual
sorting and dynamic node columns.
This commit is contained in:
Fringg
2026-02-07 09:04:55 +03:00
parent 280f4aef0d
commit a034a6068c
10 changed files with 716 additions and 8 deletions

View File

@@ -761,7 +761,8 @@
"campaigns": "Campaigns",
"promoOffers": "Promo Offers",
"promocodes": "Promo Codes",
"promoGroups": "Discount Groups"
"promoGroups": "Discount Groups",
"trafficUsage": "Traffic Usage"
},
"panel": {
"title": "Admin Panel",
@@ -783,7 +784,26 @@
"campaignsDesc": "Advertising campaigns",
"promoOffersDesc": "Personal discounts",
"promocodesDesc": "Manage promo codes",
"promoGroupsDesc": "Discount groups for users"
"promoGroupsDesc": "Discount groups for users",
"trafficUsageDesc": "Per-user traffic by nodes"
},
"trafficUsage": {
"title": "Traffic Usage",
"subtitle": "Per-user traffic statistics by nodes",
"period": "Period",
"days": "d",
"exportCsv": "Export CSV",
"exportSuccess": "CSV sent to your Telegram",
"exportError": "Failed to export",
"user": "User",
"tariff": "Tariff",
"devices": "Devices",
"trafficLimit": "Limit",
"total": "Total",
"noData": "No traffic data",
"loading": "Loading traffic data...",
"noTariff": "\u2014",
"search": "Search by name or username"
},
"emailTemplates": {
"title": "Email Templates",

View File

@@ -642,7 +642,8 @@
"promocodes": "کدهای تخفیف",
"promoGroups": "گروه‌های تخفیف",
"remnawave": "RemnaWave",
"users": "کاربران"
"users": "کاربران",
"trafficUsage": "مصرف ترافیک"
},
"panel": {
"title": "پنل مدیریت",
@@ -664,7 +665,26 @@
"promocodesDesc": "مدیریت کدهای تخفیف",
"promoGroupsDesc": "گروه‌های تخفیف برای کاربران",
"remnawaveDesc": "مدیریت پنل و آمار",
"usersDesc": "مدیریت کاربران ربات"
"usersDesc": "مدیریت کاربران ربات",
"trafficUsageDesc": "ترافیک هر کاربر بر اساس نود"
},
"trafficUsage": {
"title": "مصرف ترافیک",
"subtitle": "آمار ترافیک کاربران بر اساس نودها",
"period": "دوره",
"days": "روز",
"exportCsv": "خروجی CSV",
"exportSuccess": "CSV به تلگرام شما ارسال شد",
"exportError": "خطا در خروجی",
"user": "کاربر",
"tariff": "تعرفه",
"devices": "دستگاه‌ها",
"trafficLimit": "محدودیت",
"total": "کل",
"noData": "داده ترافیکی موجود نیست",
"loading": "در حال بارگذاری داده‌های ترافیک...",
"noTariff": "\u2014",
"search": "جستجو بر اساس نام یا نام کاربری"
},
"emailTemplates": {
"title": "قالب‌های ایمیل",

View File

@@ -782,7 +782,8 @@
"campaigns": "Кампании",
"promoOffers": "Промопредложения",
"promocodes": "Промокоды",
"promoGroups": "Группы скидок"
"promoGroups": "Группы скидок",
"trafficUsage": "Расход трафика"
},
"panel": {
"title": "Панель администратора",
@@ -804,7 +805,26 @@
"campaignsDesc": "Рекламные кампании",
"promoOffersDesc": "Персональные скидки",
"promocodesDesc": "Управление промокодами",
"promoGroupsDesc": "Группы скидок для пользователей"
"promoGroupsDesc": "Группы скидок для пользователей",
"trafficUsageDesc": "Трафик пользователей по нодам"
},
"trafficUsage": {
"title": "Расход трафика",
"subtitle": "Статистика трафика по пользователям и нодам",
"period": "Период",
"days": "д",
"exportCsv": "Экспорт CSV",
"exportSuccess": "CSV отправлен в ваш Telegram",
"exportError": "Ошибка экспорта",
"user": "Пользователь",
"tariff": "Тариф",
"devices": "Устройства",
"trafficLimit": "Лимит",
"total": "Всего",
"noData": "Нет данных о трафике",
"loading": "Загрузка данных о трафике...",
"noTariff": "\u2014",
"search": "Поиск по имени или юзернейму"
},
"emailTemplates": {
"title": "Email-шаблоны",

View File

@@ -642,7 +642,8 @@
"promocodes": "促销码",
"promoGroups": "折扣组",
"remnawave": "RemnaWave",
"users": "用户"
"users": "用户",
"trafficUsage": "流量使用"
},
"panel": {
"title": "管理面板",
@@ -664,7 +665,26 @@
"promocodesDesc": "管理促销码",
"promoGroupsDesc": "用户折扣组",
"remnawaveDesc": "面板管理和统计",
"usersDesc": "管理机器人用户"
"usersDesc": "管理机器人用户",
"trafficUsageDesc": "按节点统计用户流量"
},
"trafficUsage": {
"title": "流量使用",
"subtitle": "按节点的用户流量统计",
"period": "周期",
"days": "天",
"exportCsv": "导出CSV",
"exportSuccess": "CSV已发送到您的Telegram",
"exportError": "导出失败",
"user": "用户",
"tariff": "套餐",
"devices": "设备",
"trafficLimit": "限制",
"total": "总计",
"noData": "无流量数据",
"loading": "正在加载流量数据...",
"noTariff": "\u2014",
"search": "按名称或用户名搜索"
},
"paymentMethods": {
"title": "支付方法",