110 lines
7.3 KiB
PHP
110 lines
7.3 KiB
PHP
<x-layouts.app title="Dashboard">
|
||
<div class="space-y-6">
|
||
{{-- Statistik-Karten --}}
|
||
<div class="grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-5">
|
||
<a href="{{ route('admin.press-releases.index') }}" wire:navigate class="block">
|
||
<div class="rounded-xl border border-zinc-200 bg-white p-4 transition hover:border-zinc-300 dark:border-zinc-700 dark:bg-zinc-900">
|
||
<p class="text-xs text-zinc-500">{{ __('PMs gesamt') }}</p>
|
||
<p class="mt-1 text-2xl font-bold">{{ number_format($stats['press_releases']['total']) }}</p>
|
||
<div class="mt-2 flex gap-2 text-xs text-zinc-400">
|
||
<span class="text-green-600">{{ $stats['press_releases']['published'] }} pub</span>
|
||
<span class="text-yellow-600">{{ $stats['press_releases']['review'] }} prüf</span>
|
||
<span>{{ $stats['press_releases']['draft'] }} entwurf</span>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
|
||
<a href="{{ route('admin.companies.index') }}" wire:navigate class="block">
|
||
<div class="rounded-xl border border-zinc-200 bg-white p-4 transition hover:border-zinc-300 dark:border-zinc-700 dark:bg-zinc-900">
|
||
<p class="text-xs text-zinc-500">{{ __('Firmen') }}</p>
|
||
<p class="mt-1 text-2xl font-bold">{{ number_format($stats['companies']) }}</p>
|
||
</div>
|
||
</a>
|
||
|
||
<a href="{{ route('admin.contacts.index') }}" wire:navigate class="block">
|
||
<div class="rounded-xl border border-zinc-200 bg-white p-4 transition hover:border-zinc-300 dark:border-zinc-700 dark:bg-zinc-900">
|
||
<p class="text-xs text-zinc-500">{{ __('Kontakte') }}</p>
|
||
<p class="mt-1 text-2xl font-bold">{{ number_format($stats['contacts']) }}</p>
|
||
</div>
|
||
</a>
|
||
|
||
<a href="{{ route('admin.users.index') }}" wire:navigate class="block">
|
||
<div class="rounded-xl border border-zinc-200 bg-white p-4 transition hover:border-zinc-300 dark:border-zinc-700 dark:bg-zinc-900">
|
||
<p class="text-xs text-zinc-500">{{ __('Benutzer') }}</p>
|
||
<p class="mt-1 text-2xl font-bold">{{ number_format($stats['users']) }}</p>
|
||
</div>
|
||
</a>
|
||
|
||
<div class="rounded-xl border border-zinc-200 bg-white p-4 dark:border-zinc-700 dark:bg-zinc-900">
|
||
<p class="text-xs text-zinc-500">{{ __('Newsletter') }}</p>
|
||
<p class="mt-1 text-2xl font-bold">{{ number_format($stats['newsletter']) }}</p>
|
||
<p class="mt-2 text-xs text-zinc-400">{{ __('bestätigt') }}</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid gap-6 lg:grid-cols-[1fr,360px]">
|
||
{{-- Letzte Pressemitteilungen --}}
|
||
<div class="overflow-hidden rounded-xl border border-zinc-200 bg-white dark:border-zinc-700 dark:bg-zinc-900">
|
||
<div class="flex items-center justify-between border-b border-zinc-200 px-4 py-3 dark:border-zinc-700">
|
||
<h2 class="font-semibold">{{ __('Letzte Pressemitteilungen') }}</h2>
|
||
<a href="{{ route('admin.press-releases.index') }}" wire:navigate class="text-sm text-blue-600 hover:underline dark:text-blue-400">{{ __('Alle anzeigen') }}</a>
|
||
</div>
|
||
<div class="divide-y divide-zinc-100 dark:divide-zinc-800">
|
||
@forelse($recentPRs as $pr)
|
||
<a href="{{ route('admin.press-releases.show', $pr->id) }}" wire:navigate
|
||
class="flex items-center justify-between gap-3 px-4 py-3 transition hover:bg-zinc-50 dark:hover:bg-zinc-800">
|
||
<div class="min-w-0 flex-1">
|
||
<p class="truncate text-sm font-medium">{{ $pr->title }}</p>
|
||
<p class="text-xs text-zinc-500">{{ $pr->company?->name ?? '–' }} · {{ $pr->created_at->format('d.m.Y') }}</p>
|
||
</div>
|
||
<span class="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium {{ match($pr->status->value) {
|
||
'published' => 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
|
||
'review' => 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',
|
||
'rejected' => 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
|
||
'archived' => 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',
|
||
default => 'bg-zinc-100 text-zinc-600 dark:bg-zinc-700 dark:text-zinc-300',
|
||
} }}">
|
||
{{ $pr->status->label() }}
|
||
</span>
|
||
</a>
|
||
@empty
|
||
<p class="px-4 py-6 text-center text-sm text-zinc-500">{{ __('Noch keine Pressemitteilungen.') }}</p>
|
||
@endforelse
|
||
</div>
|
||
</div>
|
||
|
||
{{-- Warteschlange Prüfung --}}
|
||
<div class="overflow-hidden rounded-xl border border-zinc-200 bg-white dark:border-zinc-700 dark:bg-zinc-900">
|
||
<div class="flex items-center justify-between border-b border-zinc-200 px-4 py-3 dark:border-zinc-700">
|
||
<h2 class="font-semibold">{{ __('Zur Prüfung') }}</h2>
|
||
@if($stats['press_releases']['review'] > 0)
|
||
<span class="rounded-full bg-yellow-100 px-2 py-0.5 text-xs font-medium text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400">
|
||
{{ $stats['press_releases']['review'] }}
|
||
</span>
|
||
@endif
|
||
</div>
|
||
<div class="divide-y divide-zinc-100 dark:divide-zinc-800">
|
||
@forelse($pendingReviews as $pr)
|
||
<a href="{{ route('admin.press-releases.show', $pr->id) }}" wire:navigate
|
||
class="block px-4 py-3 transition hover:bg-zinc-50 dark:hover:bg-zinc-800">
|
||
<p class="truncate text-sm font-medium">{{ $pr->title }}</p>
|
||
<p class="text-xs text-zinc-500">
|
||
{{ $pr->company?->name ?? '–' }} · {{ $pr->portal->label() }} · {{ $pr->created_at->format('d.m.Y') }}
|
||
</p>
|
||
</a>
|
||
@empty
|
||
<p class="px-4 py-6 text-center text-sm text-zinc-500">{{ __('Keine PMs in der Prüfwarteschlange.') }}</p>
|
||
@endforelse
|
||
</div>
|
||
@if($stats['press_releases']['review'] > count($pendingReviews))
|
||
<div class="border-t border-zinc-100 px-4 py-2 dark:border-zinc-800">
|
||
<a href="{{ route('admin.press-releases.index', ['statusFilter' => 'review']) }}" wire:navigate
|
||
class="text-xs text-blue-600 hover:underline dark:text-blue-400">
|
||
+ {{ $stats['press_releases']['review'] - count($pendingReviews) }} {{ __('weitere') }}
|
||
</a>
|
||
</div>
|
||
@endif
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</x-layouts.app>
|