feat: add referral network graph visualization page

Interactive Sigma.js + graphology graph with ForceAtlas2 web worker
layout, campaign/user node coloring, filters via nodeReducer pattern,
search highlighting, user/campaign detail side panels, and 4-locale
translations. Dependencies: sigma v3, graphology, graphology-layout-forceatlas2.
This commit is contained in:
Fringg
2026-03-19 07:56:01 +03:00
parent 84f0e4e9b4
commit 235eaec85f
23 changed files with 2126 additions and 8 deletions

View File

@@ -1106,7 +1106,8 @@
"policies": "Access Policies",
"auditLog": "Audit Log",
"salesStats": "Sales Statistics",
"landings": "Landings"
"landings": "Landings",
"referralNetwork": "Referral Network"
},
"panel": {
"title": "Admin Panel",
@@ -1140,7 +1141,8 @@
"policiesDesc": "Configure ABAC access policies",
"auditLogDesc": "Review system activity and access history",
"salesStatsDesc": "Sales analytics and trends",
"landingsDesc": "Quick purchase landing pages"
"landingsDesc": "Quick purchase landing pages",
"referralNetworkDesc": "Referral graph and campaign visualization"
},
"salesStats": {
"title": "Sales Statistics",
@@ -1222,6 +1224,77 @@
},
"loadError": "Failed to load statistics"
},
"referralNetwork": {
"title": "Referral Network",
"subtitle": "Referral graph and advertising campaign visualization",
"search": {
"placeholder": "Search by TG ID, @username, email, campaign...",
"noResults": "Nothing found",
"resultsCount": "Found: {{count}}",
"clear": "Clear search"
},
"filters": {
"title": "Filters",
"campaigns": "Campaigns",
"partnersOnly": "Partners only",
"minReferrals": "Min referrals",
"reset": "Reset"
},
"stats": {
"totalUsers": "Users",
"totalReferrers": "Referrers",
"totalCampaigns": "Campaigns",
"totalEarnings": "Total earnings"
},
"legend": {
"title": "Legend",
"regularUser": "Regular user",
"activeReferrer": "Active referrer",
"partner": "Partner",
"topReferrer": "Top referrer (10+)",
"campaignUser": "From campaign",
"campaignNode": "Ad campaign"
},
"user": {
"tgId": "TG ID",
"email": "Email",
"partner": "Partner",
"subscription": "Subscription",
"validUntil": "until {{date}}",
"noSubscription": "No subscription",
"personalStats": "Personal statistics",
"totalSpent": "Total spent",
"referralEarnings": "Referral earnings",
"referralBranch": "Referral branch",
"directReferrals": "Direct referrals",
"branchSize": "Total in branch",
"branchRevenue": "Branch revenue",
"source": "Source",
"referredBy": "Referred by",
"fromCampaign": "Campaign",
"organic": "Organic"
},
"campaign": {
"startParam": "Parameter",
"active": "Active",
"inactive": "Inactive",
"directUsers": "Direct",
"totalNetwork": "Total network",
"totalRevenue": "Total revenue",
"conversionRate": "Conversion",
"avgCheck": "Avg check",
"topReferrers": "Top referrers from campaign"
},
"controls": {
"zoomIn": "Zoom in",
"zoomOut": "Zoom out",
"resetZoom": "Reset zoom",
"fullscreen": "Fullscreen"
},
"loading": "Loading graph...",
"error": "Failed to load network data",
"empty": "No data to display"
},
"trafficUsage": {
"title": "Traffic Usage",
"subtitle": "Per-user traffic statistics by nodes",

View File

@@ -940,7 +940,8 @@
"policies": "سیاست‌های دسترسی",
"auditLog": "گزارش بازرسی",
"salesStats": "آمار فروش",
"landings": "صفحات فرود"
"landings": "صفحات فرود",
"referralNetwork": "شبکه ارجاع"
},
"panel": {
"title": "پنل مدیریت",
@@ -974,7 +975,8 @@
"policiesDesc": "تنظیم سیاست‌های کنترل دسترسی ABAC",
"auditLogDesc": "بررسی فعالیت سیستم و تاریخچه دسترسی",
"salesStatsDesc": "تحلیل فروش و روندها",
"landingsDesc": "صفحات خرید سریع"
"landingsDesc": "صفحات خرید سریع",
"referralNetworkDesc": "نمایش بصری گراف ارجاعات و کمپین‌ها"
},
"salesStats": {
"title": "آمار فروش",
@@ -1056,6 +1058,77 @@
},
"loadError": "بارگذاری آمار ناموفق بود"
},
"referralNetwork": {
"title": "شبکه ارجاع",
"subtitle": "نمایش بصری گراف ارجاعات و کمپین‌های تبلیغاتی",
"search": {
"placeholder": "جستجو بر اساس TG ID، @نام‌کاربری، ایمیل، کمپین...",
"noResults": "نتیجه‌ای یافت نشد",
"resultsCount": "یافت شد: {{count}}",
"clear": "پاک کردن جستجو"
},
"filters": {
"title": "فیلترها",
"campaigns": "کمپین‌ها",
"partnersOnly": "فقط شرکا",
"minReferrals": "حداقل ارجاعات",
"reset": "بازنشانی"
},
"stats": {
"totalUsers": "کاربران",
"totalReferrers": "ارجاع‌دهندگان",
"totalCampaigns": "کمپین‌ها",
"totalEarnings": "درآمد کل"
},
"legend": {
"title": "راهنما",
"regularUser": "کاربر عادی",
"activeReferrer": "ارجاع‌دهنده فعال",
"partner": "شریک",
"topReferrer": "ارجاع‌دهنده برتر (+۱۰)",
"campaignUser": "از کمپین",
"campaignNode": "کمپین تبلیغاتی"
},
"user": {
"tgId": "شناسه TG",
"email": "ایمیل",
"partner": "شریک",
"subscription": "اشتراک",
"validUntil": "تا {{date}}",
"noSubscription": "بدون اشتراک",
"personalStats": "آمار شخصی",
"totalSpent": "مجموع پرداختی",
"referralEarnings": "درآمد ارجاع",
"referralBranch": "شاخه ارجاع",
"directReferrals": "ارجاعات مستقیم",
"branchSize": "کل شاخه",
"branchRevenue": "درآمد شاخه",
"source": "منبع",
"referredBy": "معرفی شده توسط",
"fromCampaign": "کمپین",
"organic": "طبیعی"
},
"campaign": {
"startParam": "پارامتر",
"active": "فعال",
"inactive": "غیرفعال",
"directUsers": "مستقیم",
"totalNetwork": "کل شبکه",
"totalRevenue": "درآمد کل",
"conversionRate": "نرخ تبدیل",
"avgCheck": "میانگین مبلغ",
"topReferrers": "ارجاع‌دهندگان برتر کمپین"
},
"controls": {
"zoomIn": "بزرگ‌نمایی",
"zoomOut": "کوچک‌نمایی",
"resetZoom": "بازنشانی زوم",
"fullscreen": "تمام‌صفحه"
},
"loading": "بارگذاری گراف...",
"error": "خطا در بارگذاری داده‌های شبکه",
"empty": "داده‌ای برای نمایش وجود ندارد"
},
"trafficUsage": {
"title": "مصرف ترافیک",
"subtitle": "آمار ترافیک کاربران بر اساس نودها",

View File

@@ -1127,7 +1127,8 @@
"policies": "Политики доступа",
"auditLog": "Журнал аудита",
"salesStats": "Статистика продаж",
"landings": "Лендинги"
"landings": "Лендинги",
"referralNetwork": "Реферальная сеть"
},
"panel": {
"title": "Панель администратора",
@@ -1161,7 +1162,8 @@
"policiesDesc": "Настройка политик контроля доступа ABAC",
"auditLogDesc": "Просмотр активности системы и истории доступа",
"salesStatsDesc": "Аналитика продаж и тренды",
"landingsDesc": "Страницы быстрой покупки"
"landingsDesc": "Страницы быстрой покупки",
"referralNetworkDesc": "Визуализация графа рефералов и РК"
},
"salesStats": {
"title": "Статистика продаж",
@@ -1243,6 +1245,77 @@
},
"loadError": "Не удалось загрузить статистику"
},
"referralNetwork": {
"title": "Реферальная сеть",
"subtitle": "Визуализация графа рефералов и рекламных кампаний",
"search": {
"placeholder": "Поиск по TG ID, @username, email, кампании...",
"noResults": "Ничего не найдено",
"resultsCount": "Найдено: {{count}}",
"clear": "Очистить поиск"
},
"filters": {
"title": "Фильтры",
"campaigns": "Кампании",
"partnersOnly": "Только партнёры",
"minReferrals": "Мин. рефералов",
"reset": "Сбросить"
},
"stats": {
"totalUsers": "Пользователей",
"totalReferrers": "Рефереров",
"totalCampaigns": "Кампаний",
"totalEarnings": "Общий доход"
},
"legend": {
"title": "Легенда",
"regularUser": "Обычный",
"activeReferrer": "Активный реферер",
"partner": "Партнёр",
"topReferrer": "Топ-реферер (10+)",
"campaignUser": "Из кампании",
"campaignNode": "Рекламная кампания"
},
"user": {
"tgId": "TG ID",
"email": "Email",
"partner": "Партнёр",
"subscription": "Подписка",
"validUntil": "до {{date}}",
"noSubscription": "Нет подписки",
"personalStats": "Личная статистика",
"totalSpent": "Оплачено всего",
"referralEarnings": "Реф. доход",
"referralBranch": "Реферальная ветка",
"directReferrals": "Привёл людей",
"branchSize": "Всего в ветке",
"branchRevenue": "Доход ветки",
"source": "Источник",
"referredBy": "Пришёл от",
"fromCampaign": "РК",
"organic": "Органический"
},
"campaign": {
"startParam": "Параметр",
"active": "Активна",
"inactive": "Неактивна",
"directUsers": "Напрямую",
"totalNetwork": "Вся сеть",
"totalRevenue": "Общий доход",
"conversionRate": "Конверсия",
"avgCheck": "Средний чек",
"topReferrers": "Топ-рефереры из кампании"
},
"controls": {
"zoomIn": "Приблизить",
"zoomOut": "Отдалить",
"resetZoom": "Сбросить зум",
"fullscreen": "Полный экран"
},
"loading": "Загрузка графа...",
"error": "Ошибка загрузки данных сети",
"empty": "Нет данных для отображения"
},
"trafficUsage": {
"title": "Расход трафика",
"subtitle": "Статистика трафика по пользователям и нодам",

View File

@@ -940,7 +940,8 @@
"policies": "访问策略",
"auditLog": "审计日志",
"salesStats": "销售统计",
"landings": "落地页"
"landings": "落地页",
"referralNetwork": "推荐网络"
},
"panel": {
"title": "管理面板",
@@ -974,7 +975,8 @@
"policiesDesc": "配置ABAC访问控制策略",
"auditLogDesc": "查看系统活动和访问历史",
"salesStatsDesc": "销售分析与趋势",
"landingsDesc": "快速购买落地页"
"landingsDesc": "快速购买落地页",
"referralNetworkDesc": "推荐图表和广告活动可视化"
},
"salesStats": {
"title": "销售统计",
@@ -1056,6 +1058,77 @@
},
"loadError": "加载统计失败"
},
"referralNetwork": {
"title": "推荐网络",
"subtitle": "推荐图表和广告活动可视化",
"search": {
"placeholder": "按TG ID、@用户名、邮箱、活动搜索...",
"noResults": "未找到",
"resultsCount": "找到: {{count}}",
"clear": "清除搜索"
},
"filters": {
"title": "过滤器",
"campaigns": "活动",
"partnersOnly": "仅合作伙伴",
"minReferrals": "最少推荐数",
"reset": "重置"
},
"stats": {
"totalUsers": "用户",
"totalReferrers": "推荐人",
"totalCampaigns": "活动",
"totalEarnings": "总收入"
},
"legend": {
"title": "图例",
"regularUser": "普通用户",
"activeReferrer": "活跃推荐人",
"partner": "合作伙伴",
"topReferrer": "顶级推荐人 (10+)",
"campaignUser": "来自活动",
"campaignNode": "广告活动"
},
"user": {
"tgId": "TG ID",
"email": "邮箱",
"partner": "合作伙伴",
"subscription": "订阅",
"validUntil": "有效至 {{date}}",
"noSubscription": "无订阅",
"personalStats": "个人统计",
"totalSpent": "总花费",
"referralEarnings": "推荐收入",
"referralBranch": "推荐分支",
"directReferrals": "直接推荐",
"branchSize": "分支总人数",
"branchRevenue": "分支收入",
"source": "来源",
"referredBy": "由...推荐",
"fromCampaign": "活动",
"organic": "自然流量"
},
"campaign": {
"startParam": "参数",
"active": "活跃",
"inactive": "非活跃",
"directUsers": "直接",
"totalNetwork": "总网络",
"totalRevenue": "总收入",
"conversionRate": "转化率",
"avgCheck": "平均金额",
"topReferrers": "活动顶级推荐人"
},
"controls": {
"zoomIn": "放大",
"zoomOut": "缩小",
"resetZoom": "重置缩放",
"fullscreen": "全屏"
},
"loading": "加载图表...",
"error": "加载网络数据失败",
"empty": "无数据显示"
},
"trafficUsage": {
"title": "流量使用",
"subtitle": "按节点的用户流量统计",