mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-28 22:01:33 +00:00
293 lines
18 KiB
PHP
293 lines
18 KiB
PHP
@extends('layouts.admin')
|
|
|
|
@section('content')
|
|
<div class="space-y-6">
|
|
<x-admin.page-header title="Promotion Statistics" icon="fas fa-chart-bar" subtitle="Overview of all promotion activities">
|
|
<x-slot:actions>
|
|
<x-admin.button :href="route('admin.promotions.index')" tone="gray" icon="fas fa-arrow-left">Back to Promotions</x-admin.button>
|
|
</x-slot:actions>
|
|
</x-admin.page-header>
|
|
|
|
<!-- Date Range Filter -->
|
|
<x-admin.card class="p-6 mb-6">
|
|
<form method="GET" action="{{ route('admin.promotions.statistics') }}" class="flex flex-wrap gap-4 items-end" x-data="periodFilter({{ $selectedPeriod === 'custom' ? 'true' : 'false' }})" x-ref="periodForm">
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Quick Select</label>
|
|
<select name="period" class="form-select rounded-md border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200" @change="onPeriodChange()">
|
|
<option value="7days" {{ $selectedPeriod === '7days' ? 'selected' : '' }}>Last 7 Days</option>
|
|
<option value="30days" {{ $selectedPeriod === '30days' ? 'selected' : '' }}>Last 30 Days</option>
|
|
<option value="90days" {{ $selectedPeriod === '90days' ? 'selected' : '' }}>Last 90 Days</option>
|
|
<option value="year" {{ $selectedPeriod === 'year' ? 'selected' : '' }}>Last Year</option>
|
|
<option value="all" {{ $selectedPeriod === 'all' ? 'selected' : '' }}>All Time</option>
|
|
<option value="custom" {{ $selectedPeriod === 'custom' ? 'selected' : '' }}>Custom Range</option>
|
|
</select>
|
|
</div>
|
|
<div x-show="showCustom" x-cloak class="flex gap-4">
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Start Date</label>
|
|
<input type="date" name="start_date" value="{{ $startDate ? formatDate($startDate) : '' }}" class="form-input rounded-md border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200">
|
|
</div>
|
|
<div>
|
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">End Date</label>
|
|
<input type="date" name="end_date" value="{{ formatDate($endDate) }}" class="form-input rounded-md border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200">
|
|
</div>
|
|
<div>
|
|
<button type="submit" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">
|
|
<i class="fas fa-filter mr-2"></i>Apply
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</x-admin.card>
|
|
|
|
<!-- Overall Statistics Cards -->
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-6 mb-6">
|
|
<x-admin.card class="p-6">
|
|
<div class="flex items-center">
|
|
<div class="shrink-0 bg-blue-100 dark:bg-blue-900 rounded-full p-3">
|
|
<i class="fas fa-gift text-2xl text-blue-600 dark:text-blue-400"></i>
|
|
</div>
|
|
<div class="ml-4">
|
|
<p class="text-sm text-gray-500 dark:text-gray-400">Total Promotions</p>
|
|
<p class="text-2xl font-bold text-gray-800 dark:text-gray-200">{{ $overallStats['total_promotions'] }}</p>
|
|
</div>
|
|
</div>
|
|
</x-admin.card>
|
|
|
|
<x-admin.card class="p-6">
|
|
<div class="flex items-center">
|
|
<div class="shrink-0 bg-green-100 dark:bg-green-900 rounded-full p-3">
|
|
<i class="fas fa-check-circle text-2xl text-green-600 dark:text-green-400"></i>
|
|
</div>
|
|
<div class="ml-4">
|
|
<p class="text-sm text-gray-500 dark:text-gray-400">Active Promotions</p>
|
|
<p class="text-2xl font-bold text-gray-800 dark:text-gray-200">{{ $overallStats['active_promotions'] }}</p>
|
|
</div>
|
|
</div>
|
|
</x-admin.card>
|
|
|
|
<x-admin.card class="p-6">
|
|
<div class="flex items-center">
|
|
<div class="shrink-0 bg-purple-100 dark:bg-purple-900 rounded-full p-3">
|
|
<i class="fas fa-arrow-up text-2xl text-purple-600 dark:text-purple-400"></i>
|
|
</div>
|
|
<div class="ml-4">
|
|
<p class="text-sm text-gray-500 dark:text-gray-400">Total Applications</p>
|
|
<p class="text-2xl font-bold text-gray-800 dark:text-gray-200">{{ number_format($overallStats['total_applications']) }}</p>
|
|
</div>
|
|
</div>
|
|
</x-admin.card>
|
|
|
|
<x-admin.card class="p-6">
|
|
<div class="flex items-center">
|
|
<div class="shrink-0 bg-yellow-100 dark:bg-yellow-900 rounded-full p-3">
|
|
<i class="fas fa-users text-2xl text-yellow-600 dark:text-yellow-400"></i>
|
|
</div>
|
|
<div class="ml-4">
|
|
<p class="text-sm text-gray-500 dark:text-gray-400">Unique Users</p>
|
|
<p class="text-2xl font-bold text-gray-800 dark:text-gray-200">{{ number_format($overallStats['unique_users']) }}</p>
|
|
</div>
|
|
</div>
|
|
</x-admin.card>
|
|
|
|
<x-admin.card class="p-6">
|
|
<div class="flex items-center">
|
|
<div class="shrink-0 bg-red-100 dark:bg-red-900 rounded-full p-3">
|
|
<i class="fas fa-calendar-plus text-2xl text-red-600 dark:text-red-400"></i>
|
|
</div>
|
|
<div class="ml-4">
|
|
<p class="text-sm text-gray-500 dark:text-gray-400">Total Days Added</p>
|
|
<p class="text-2xl font-bold text-gray-800 dark:text-gray-200">{{ number_format($overallStats['total_days_added']) }}</p>
|
|
</div>
|
|
</div>
|
|
</x-admin.card>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
|
|
<!-- Top Promotions -->
|
|
<x-admin.card>
|
|
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
|
|
<h2 class="text-xl font-semibold text-gray-800 dark:text-gray-200">
|
|
<i class="fas fa-trophy mr-2 text-yellow-500"></i>Top Promotions by Usage
|
|
</h2>
|
|
</div>
|
|
<div class="p-6">
|
|
@if($topPromotions->isEmpty())
|
|
<p class="text-gray-500 dark:text-gray-400 text-center py-4">No promotion data available</p>
|
|
@else
|
|
<div class="space-y-4">
|
|
@foreach($topPromotions as $promotion)
|
|
<div class="flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
|
|
<div class="flex-1">
|
|
<h3 class="font-semibold text-gray-800 dark:text-gray-200">{{ $promotion->name }}</h3>
|
|
<div class="flex gap-4 mt-1 text-sm text-gray-500 dark:text-gray-400">
|
|
<span><i class="fas fa-arrow-up mr-1"></i>{{ $promotion->statistics_count }} applications</span>
|
|
<span><i class="fas fa-calendar mr-1"></i>{{ $promotion->additional_days }} days</span>
|
|
</div>
|
|
</div>
|
|
<a href="{{ route('admin.promotions.show-statistics', $promotion->id) }}" class="px-3 py-1 bg-blue-600 text-white text-sm rounded hover:bg-blue-700">
|
|
View Details
|
|
</a>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</x-admin.card>
|
|
|
|
<!-- Statistics by Role -->
|
|
<x-admin.card>
|
|
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
|
|
<h2 class="text-xl font-semibold text-gray-800 dark:text-gray-200">
|
|
<i class="fas fa-user-tag mr-2"></i>Statistics by Role
|
|
</h2>
|
|
</div>
|
|
<div class="p-6">
|
|
@if($statsByRole->isEmpty())
|
|
<p class="text-gray-500 dark:text-gray-400 text-center py-4">No role data available</p>
|
|
@else
|
|
<div class="space-y-4">
|
|
@foreach($statsByRole as $roleStat)
|
|
<div class="p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
|
|
<h3 class="font-semibold text-gray-800 dark:text-gray-200 mb-2">
|
|
{{ $roleStat->role->name ?? 'Unknown Role' }}
|
|
</h3>
|
|
<div class="grid grid-cols-3 gap-4 text-sm">
|
|
<div>
|
|
<p class="text-gray-500 dark:text-gray-400">Upgrades</p>
|
|
<p class="text-lg font-bold text-gray-800 dark:text-gray-200">{{ number_format($roleStat->total_upgrades) }}</p>
|
|
</div>
|
|
<div>
|
|
<p class="text-gray-500 dark:text-gray-400">Users</p>
|
|
<p class="text-lg font-bold text-gray-800 dark:text-gray-200">{{ number_format($roleStat->unique_users) }}</p>
|
|
</div>
|
|
<div>
|
|
<p class="text-gray-500 dark:text-gray-400">Days Added</p>
|
|
<p class="text-lg font-bold text-gray-800 dark:text-gray-200">{{ number_format($roleStat->total_days) }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</x-admin.card>
|
|
</div>
|
|
|
|
<!-- All Promotions with Statistics -->
|
|
<x-admin.card>
|
|
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
|
|
<h2 class="text-xl font-semibold text-gray-800 dark:text-gray-200">
|
|
<i class="fas fa-list mr-2"></i>All Promotions Statistics
|
|
</h2>
|
|
</div>
|
|
<div class="overflow-x-auto">
|
|
<table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
<tr>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Promotion</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Applications</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Days/Application</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Status</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">
|
|
@forelse($promotions as $promotion)
|
|
<tr class="hover:bg-gray-50 dark:hover:bg-gray-700">
|
|
<td class="px-6 py-4">
|
|
<div class="text-sm font-medium text-gray-900 dark:text-gray-100">{{ $promotion->name }}</div>
|
|
@if($promotion->description)
|
|
<div class="text-xs text-gray-500 dark:text-gray-400">{{ Str::limit($promotion->description, 50) }}</div>
|
|
@endif
|
|
</td>
|
|
<td class="px-6 py-4 whitespace-nowrap">
|
|
<span class="text-lg font-bold text-gray-800 dark:text-gray-200">{{ number_format($promotion->statistics_count) }}</span>
|
|
<span class="text-sm text-gray-500 dark:text-gray-400">times</span>
|
|
</td>
|
|
<td class="px-6 py-4 whitespace-nowrap">
|
|
<span class="text-sm font-semibold text-gray-800 dark:text-gray-200">{{ $promotion->additional_days }}</span>
|
|
<span class="text-sm text-gray-500 dark:text-gray-400">days</span>
|
|
</td>
|
|
<td class="px-6 py-4 whitespace-nowrap">
|
|
@if($promotion->is_active && $promotion->isCurrentlyActive())
|
|
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200">
|
|
<i class="fas fa-check mr-1"></i>Active
|
|
</span>
|
|
@else
|
|
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200">
|
|
Inactive
|
|
</span>
|
|
@endif
|
|
</td>
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
|
|
<a href="{{ route('admin.promotions.show-statistics', $promotion->id) }}" class="text-blue-600 dark:text-blue-400 hover:text-blue-900 dark:hover:text-blue-300">
|
|
View Details <i class="fas fa-arrow-right ml-1"></i>
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td colspan="5" class="px-6 py-8 text-center text-gray-500 dark:text-gray-400">
|
|
No promotions available
|
|
</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</x-admin.card>
|
|
|
|
<!-- Recent Activity -->
|
|
<x-admin.card class="mt-6">
|
|
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
|
|
<h2 class="text-xl font-semibold text-gray-800 dark:text-gray-200">
|
|
<i class="fas fa-clock mr-2"></i>Recent Promotion Activity
|
|
</h2>
|
|
</div>
|
|
<div class="overflow-x-auto">
|
|
<table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
<tr>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">User</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Promotion</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Role</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Days Added</th>
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Applied At</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">
|
|
@forelse($recentActivity as $activity)
|
|
<tr class="hover:bg-gray-50 dark:hover:bg-gray-700">
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-gray-100">
|
|
{{ $activity->user->username ?? 'Unknown User' }}
|
|
</td>
|
|
<td class="px-6 py-4 text-sm text-gray-900 dark:text-gray-100">
|
|
{{ $activity->promotion->name ?? 'Unknown Promotion' }}
|
|
</td>
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-gray-100">
|
|
<span class="px-2 py-1 bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 rounded text-xs">
|
|
{{ $activity->role->name ?? 'Unknown Role' }}
|
|
</span>
|
|
</td>
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm font-semibold text-gray-900 dark:text-gray-100">
|
|
+{{ $activity->days_added }} days
|
|
</td>
|
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400">
|
|
{{ $activity->applied_at->diffForHumans() }}
|
|
</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td colspan="5" class="px-6 py-8 text-center text-gray-500 dark:text-gray-400">
|
|
No recent activity
|
|
</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</x-admin.card>
|
|
</div>
|
|
@endsection
|