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

@@ -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": "Статистика трафика по пользователям и нодам",