23-01-2026
This commit is contained in:
parent
07959c0ba2
commit
854ce02bf6
166 changed files with 32909 additions and 1262 deletions
|
|
@ -1,57 +1,268 @@
|
|||
<?php
|
||||
|
||||
use App\Models\Partner;
|
||||
use App\Models\User;
|
||||
use App\Models\RegistrationCode;
|
||||
use App\Helpers\ThemeHelper;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Livewire\Volt\Component;
|
||||
|
||||
new class extends Component {
|
||||
public $userRole = '';
|
||||
public $roleIcon = 'shield-check';
|
||||
public $roleName = '';
|
||||
|
||||
// Admin KPIs
|
||||
public $activeHubs = 0;
|
||||
public $plannedHubs = 0;
|
||||
public $totalPartners = 0;
|
||||
public $partnersThisMonth = 0;
|
||||
public $platformRevenue = 0;
|
||||
public $systemStatus = 'green';
|
||||
public $pendingInvitations = 0;
|
||||
public $totalCustomers = 0;
|
||||
public array $data = [];
|
||||
|
||||
// Retailer KPIs
|
||||
public $openOrders = 0;
|
||||
public $monthlyRevenue = 0;
|
||||
public $productViews = 0;
|
||||
public $stockWarnings = 0;
|
||||
public $myCustomers = 0;
|
||||
|
||||
// Manufacturer KPIs
|
||||
public $brandReach = 0;
|
||||
public $activeProducts = 0;
|
||||
public $draftProducts = 0;
|
||||
public $totalViews = 0;
|
||||
|
||||
// Broker KPIs
|
||||
public $totalCommission = 0;
|
||||
public $pendingPayout = 0;
|
||||
public $generatedLeads = 0;
|
||||
public $referralLink = '';
|
||||
public $brokerCustomers = 0;
|
||||
|
||||
// Customer Brand Data
|
||||
public $customerBrand = 'b2in';
|
||||
public $customerBrandName = 'B2IN';
|
||||
public $customerBrandLogo = '';
|
||||
public $customerBrandColors = [];
|
||||
public $customerBrokerName = '';
|
||||
public $topOffers = [];
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
$user = Auth::user();
|
||||
$role = $user->roles->first();
|
||||
|
||||
if ($role) {
|
||||
$this->userRole = strtolower(str_replace('-', '', $role->name));
|
||||
$this->roleIcon = $role->icon ?? 'shield-check';
|
||||
$this->roleName = $role->display_name ?? $role->name;
|
||||
}
|
||||
|
||||
// Lade rollenspezifische Daten
|
||||
match ($this->userRole) {
|
||||
'admin', 'superadmin' => $this->loadAdminData(),
|
||||
'retailer' => $this->loadRetailerData($user),
|
||||
'manufacturer' => $this->loadManufacturerData($user),
|
||||
'broker', 'estateagent' => $this->loadBrokerData($user),
|
||||
'customer' => $this->loadCustomerData($user),
|
||||
default => null,
|
||||
};
|
||||
}
|
||||
|
||||
private function loadAdminData(): void
|
||||
{
|
||||
// Platzhalter: Aktive Hubs (später aus Hub-Tabelle)
|
||||
$this->activeHubs = 3;
|
||||
$this->plannedHubs = 2;
|
||||
|
||||
// Partner-Wachstum
|
||||
$this->totalPartners = Partner::whereIn('type', ['Retailer', 'Manufacturer', 'Broker', 'Estate-Agent'])->count();
|
||||
$this->partnersThisMonth = Partner::whereIn('type', ['Retailer', 'Manufacturer', 'Broker', 'Estate-Agent'])
|
||||
->whereMonth('created_at', now()->month)
|
||||
->count();
|
||||
|
||||
// Platzhalter: Plattform-Umsatz
|
||||
$this->platformRevenue = 125000; // Später aus Order-Tabelle
|
||||
|
||||
// System-Status (Platzhalter)
|
||||
$this->systemStatus = 'green';
|
||||
|
||||
// Onboarding-Pipeline: Codes ohne registrierte User
|
||||
$this->pendingInvitations = RegistrationCode::whereNull('used_at')->count();
|
||||
|
||||
// Kunden gesamt
|
||||
$this->totalCustomers = Partner::where('type', 'Customer')->count();
|
||||
|
||||
$this->data = [
|
||||
['date' => '2025-12-11', 'visitors' => 50],
|
||||
['date' => '2025-12-12', 'visitors' => 70],
|
||||
['date' => '2025-12-13', 'visitors' => 100],
|
||||
['date' => '2025-12-14', 'visitors' => 210],
|
||||
['date' => '2025-12-15', 'visitors' => 198],
|
||||
['date' => '2025-12-16', 'visitors' => 269],
|
||||
['date' => '2025-12-17', 'visitors' => 259],
|
||||
['date' => '2025-12-18', 'visitors' => 267],
|
||||
];
|
||||
}
|
||||
|
||||
private function loadRetailerData(User $user): void
|
||||
{
|
||||
// Platzhalter: Offene Bestellungen
|
||||
$this->openOrders = 5; // Später aus Order-Tabelle
|
||||
|
||||
// Platzhalter: Umsatz diesen Monat
|
||||
$this->monthlyRevenue = 15500; // Später aus Order-Tabelle
|
||||
|
||||
// Platzhalter: Produkt-Views
|
||||
$this->productViews = 1250; // Später aus Analytics
|
||||
|
||||
// Platzhalter: Lager-Warnungen
|
||||
$this->stockWarnings = 3; // Später aus Product-Tabelle (stock < min_stock)
|
||||
|
||||
// Meine Kunden (Kunden die diesem Händler zugeordnet sind)
|
||||
if ($user->partner_id) {
|
||||
$this->myCustomers = Partner::where('type', 'Customer')
|
||||
->where('parent_partner_id', $user->partner_id)
|
||||
->count();
|
||||
}
|
||||
}
|
||||
|
||||
private function loadManufacturerData(User $user): void
|
||||
{
|
||||
// Platzhalter: Marken-Reichweite (Händler die meine Produkte führen)
|
||||
$this->brandReach = 12; // Später aus Produkt-Zuordnungen
|
||||
|
||||
// Platzhalter: Katalog-Status
|
||||
$this->activeProducts = 45; // Später aus Product-Tabelle (is_active = true)
|
||||
$this->draftProducts = 7; // Später aus Product-Tabelle (is_active = false)
|
||||
|
||||
// Platzhalter: Gesamt-Views
|
||||
$this->totalViews = 8900; // Später aus Analytics
|
||||
}
|
||||
|
||||
private function loadBrokerData(User $user): void
|
||||
{
|
||||
// Platzhalter: Verdiente Provision
|
||||
$this->totalCommission = 4250.50; // Später aus Commission-Tabelle
|
||||
|
||||
// Platzhalter: Offene Auszahlung
|
||||
$this->pendingPayout = 850.00; // Später aus Payout-Tabelle
|
||||
|
||||
// Generierte Leads (Kunden über diesen Makler)
|
||||
if ($user->partner_id) {
|
||||
$this->generatedLeads = Partner::where('type', 'Customer')
|
||||
->where('parent_partner_id', $user->partner_id)
|
||||
->count();
|
||||
|
||||
$this->brokerCustomers = $this->generatedLeads;
|
||||
}
|
||||
|
||||
// Empfehlungs-Link (Platzhalter)
|
||||
$partner = Partner::find($user->partner_id);
|
||||
if ($partner) {
|
||||
$this->referralLink = url('/register?ref=' . $partner->partner_number);
|
||||
}
|
||||
}
|
||||
|
||||
private function loadCustomerData(User $user): void
|
||||
{
|
||||
// Kunde: Lade Brand-Daten vom Partner
|
||||
if ($user->partner_id) {
|
||||
$partner = Partner::find($user->partner_id);
|
||||
|
||||
if ($partner) {
|
||||
// Brand aus Partner-Datensatz
|
||||
$this->customerBrand = $partner->brand ?? 'b2in';
|
||||
$this->customerBrandName = ThemeHelper::getBrandName($this->customerBrand);
|
||||
$this->customerBrandLogo = ThemeHelper::getLogoPathForBrand($this->customerBrand, 'positive');
|
||||
$this->customerBrandColors = ThemeHelper::getBrandColors($this->customerBrand);
|
||||
|
||||
// Makler/Händler-Namen laden, falls vorhanden
|
||||
if ($partner->parent_partner_id) {
|
||||
$parentPartner = Partner::find($partner->parent_partner_id);
|
||||
if ($parentPartner) {
|
||||
$this->customerBrokerName = $parentPartner->display_name ?? $parentPartner->company_name ?? '';
|
||||
}
|
||||
}
|
||||
|
||||
// Top-Angebote laden (Platzhalter - später aus Product-Tabelle)
|
||||
$this->topOffers = [
|
||||
[
|
||||
'id' => 1,
|
||||
'name' => 'Designer Sofa "Luna"',
|
||||
'description' => 'Modernes 3-Sitzer Sofa mit Samtbezug',
|
||||
'price' => 1899.00,
|
||||
'original_price' => 2499.00,
|
||||
'discount' => 24,
|
||||
'image' => 'https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=400&h=300&fit=crop',
|
||||
'category' => 'Wohnzimmer',
|
||||
],
|
||||
[
|
||||
'id' => 2,
|
||||
'name' => 'Esstisch "Nordic"',
|
||||
'description' => 'Massivholz Esstisch für 6-8 Personen',
|
||||
'price' => 899.00,
|
||||
'original_price' => 1299.00,
|
||||
'discount' => 31,
|
||||
'image' => 'https://images.unsplash.com/photo-1617806118233-18e1de247200?w=400&h=300&fit=crop',
|
||||
'category' => 'Esszimmer',
|
||||
],
|
||||
[
|
||||
'id' => 3,
|
||||
'name' => 'Boxspringbett "Royal"',
|
||||
'description' => 'Premium Boxspringbett 180x200 cm',
|
||||
'price' => 1599.00,
|
||||
'original_price' => 2199.00,
|
||||
'discount' => 27,
|
||||
'image' => 'https://images.unsplash.com/photo-1505693416388-ac5ce068fe85?w=400&h=300&fit=crop',
|
||||
'category' => 'Schlafzimmer',
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
}; ?>
|
||||
|
||||
<x-layouts.app title="Dashboard">
|
||||
<div class="flex h-full w-full flex-1 flex-col gap-4 rounded-xl">
|
||||
<div class="grid auto-rows-min gap-4 md:grid-cols-3">
|
||||
<div class="relative aspect-video overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700 p-4">
|
||||
<livewire:notifications />
|
||||
@volt('dashboard')
|
||||
<div class="space-y-6">
|
||||
{{-- Header mit Rollenbadge --}}
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ __('Dashboard') }} (Beispiel)</flux:heading>
|
||||
<flux:subheading>{{ __('Willkommen zurück') }}, {{ Auth::user()->name }}!</flux:subheading>
|
||||
</div>
|
||||
<div class="relative aspect-video overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700">
|
||||
<flux:table>
|
||||
<flux:table.columns>
|
||||
<flux:table.column>Customer</flux:table.column>
|
||||
<flux:table.column>Date</flux:table.column>
|
||||
<flux:table.column>Status</flux:table.column>
|
||||
<flux:table.column>Amount</flux:table.column>
|
||||
</flux:table.columns>
|
||||
|
||||
<flux:table.rows>
|
||||
<flux:table.row>
|
||||
<flux:table.cell>Lindsey Aminoff</flux:table.cell>
|
||||
<flux:table.cell>Jul 29, 10:45 AM</flux:table.cell>
|
||||
<flux:table.cell><flux:badge color="green" size="sm" inset="top bottom">Paid</flux:badge></flux:table.cell>
|
||||
<flux:table.cell variant="strong">$49.00</flux:table.cell>
|
||||
</flux:table.row>
|
||||
|
||||
<flux:table.row>
|
||||
<flux:table.cell>Hanna Lubin</flux:table.cell>
|
||||
<flux:table.cell>Jul 28, 2:15 PM</flux:table.cell>
|
||||
<flux:table.cell><flux:badge color="green" size="sm" inset="top bottom">Paid</flux:badge></flux:table.cell>
|
||||
<flux:table.cell variant="strong">$312.00</flux:table.cell>
|
||||
</flux:table.row>
|
||||
|
||||
<flux:table.row>
|
||||
<flux:table.cell>Kianna Bushevi</flux:table.cell>
|
||||
<flux:table.cell>Jul 30, 4:05 PM</flux:table.cell>
|
||||
<flux:table.cell><flux:badge color="zinc" size="sm" inset="top bottom">Refunded</flux:badge></flux:table.cell>
|
||||
<flux:table.cell variant="strong">$132.00</flux:table.cell>
|
||||
</flux:table.row>
|
||||
|
||||
<flux:table.row>
|
||||
<flux:table.cell>Gustavo Geidt</flux:table.cell>
|
||||
<flux:table.cell>Jul 27, 9:30 AM</flux:table.cell>
|
||||
<flux:table.cell><flux:badge color="green" size="sm" inset="top bottom">Paid</flux:badge></flux:table.cell>
|
||||
<flux:table.cell variant="strong">$31.00</flux:table.cell>
|
||||
</flux:table.row>
|
||||
</flux:table.rows>
|
||||
</flux:table>
|
||||
</div>
|
||||
<div class="relative aspect-video overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700">
|
||||
<x-placeholder-pattern class="absolute inset-0 size-full stroke-gray-900/20 dark:stroke-neutral-100/20" />
|
||||
<div class="flex items-center gap-2 px-3 py-2 bg-accent-50 dark:bg-accent-900/20 rounded-lg">
|
||||
@svg('heroicon-o-'.$roleIcon, 'w-5 h-5 text-accent-600 dark:text-accent-400')
|
||||
<span class="text-sm font-medium text-accent-700 dark:text-accent-300">
|
||||
{{ $roleName }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relative h-full flex-1 overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700">
|
||||
<x-placeholder-pattern class="absolute inset-0 size-full stroke-gray-900/20 dark:stroke-neutral-100/20" />
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Rollenspezifisches Dashboard laden --}}
|
||||
@if(in_array($userRole, ['admin', 'superadmin']))
|
||||
@include('admin.dashboards.admin')
|
||||
@elseif($userRole === 'retailer')
|
||||
@include('admin.dashboards.retailer')
|
||||
@elseif($userRole === 'manufacturer')
|
||||
@include('admin.dashboards.manufacturer')
|
||||
@elseif(in_array($userRole, ['broker', 'estateagent']))
|
||||
@include('admin.dashboards.broker')
|
||||
@elseif($userRole === 'customer')
|
||||
@include('admin.dashboards.customer')
|
||||
@else
|
||||
<flux:card>
|
||||
<div class="text-center py-8">
|
||||
<div class="text-zinc-500">{{ __('Dashboard für Ihre Rolle wird noch entwickelt.') }}</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
@endif
|
||||
</div>
|
||||
@endvolt
|
||||
</x-layouts.app>
|
||||
|
||||
|
||||
|
|
|
|||
148
resources/views/admin/dashboards/admin.blade.php
Normal file
148
resources/views/admin/dashboards/admin.blade.php
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
<div class="space-y-6">
|
||||
{{-- KPI-Karten --}}
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
{{-- Aktive Hubs --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Aktive Hubs') }}</div>
|
||||
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ $activeHubs }}</div>
|
||||
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ $plannedHubs }} {{ __('geplant') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-map-pin', 'w-10 h-10 text-blue-400 dark:text-blue-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Partner-Wachstum --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Partner gesamt') }}</div>
|
||||
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ $totalPartners }}</div>
|
||||
<div class="text-xs text-green-600 dark:text-green-400 mt-1">+{{ $partnersThisMonth }} {{ __('diesen Monat') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-user-group', 'w-10 h-10 text-green-400 dark:text-green-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Plattform-Umsatz --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-purple-700 dark:text-purple-400 font-medium">{{ __('Plattform-Umsatz') }}</div>
|
||||
<div class="text-3xl font-bold text-purple-900 dark:text-purple-100 mt-2">{{ number_format($platformRevenue, 0, ',', '.') }} €</div>
|
||||
<div class="text-xs text-purple-600 dark:text-purple-400 mt-1">{{ __('Platzhalter') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-currency-euro', 'w-10 h-10 text-purple-400 dark:text-purple-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- System-Status --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-emerald-700 dark:text-emerald-300 font-medium">{{ __('System-Status') }}</div>
|
||||
<div class="text-3xl font-bold text-emerald-900 dark:text-emerald-100 mt-2">{{ __('Optimal') }}</div>
|
||||
<div class="flex items-center gap-1 mt-1">
|
||||
<div class="w-2 h-2 rounded-full bg-emerald-500 animate-pulse"></div>
|
||||
<div class="text-xs text-emerald-600 dark:text-emerald-400">{{ __('Alle Systeme laufen') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@svg('heroicon-o-server', 'w-10 h-10 text-emerald-400 dark:text-emerald-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
|
||||
{{-- Widgets --}}
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
{{-- Onboarding-Pipeline --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Onboarding-Pipeline') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Offene Einladungen') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 flex items-center justify-center py-8 bg-orange-50 dark:bg-zinc-800 rounded-lg">
|
||||
<div class="text-center">
|
||||
<div class="text-5xl font-bold text-sky-600 dark:text-sky-400">{{ $pendingInvitations }}</div>
|
||||
<div class="text-sm text-sky-700 dark:text-sky-300 mt-2">{{ __('Einladungen ohne Registrierung') }}</div>
|
||||
<flux:button href="{{ route('admin.partners.registration-codes') }}" variant="primary" size="sm" class="mt-4">
|
||||
{{ __('Einladungen verwalten') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Partner-Übersicht --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Partner & Kunden') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Übersicht der Plattform-Nutzer') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 space-y-3">
|
||||
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
@svg('heroicon-o-user', 'w-6 h-6 text-blue-500')
|
||||
<span class="font-medium">{{ __('Kunden') }}</span>
|
||||
</div>
|
||||
<span class="text-2xl font-bold">{{ $totalCustomers }}</span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
@svg('heroicon-o-building-storefront', 'w-6 h-6 text-green-500')
|
||||
<span class="font-medium">{{ __('Händler') }}</span>
|
||||
</div>
|
||||
<span class="text-2xl font-bold">{{ \App\Models\Partner::where('type', 'Retailer')->count() }}</span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
@svg('heroicon-o-building-office', 'w-6 h-6 text-purple-500')
|
||||
<span class="font-medium">{{ __('Hersteller') }}</span>
|
||||
</div>
|
||||
<span class="text-2xl font-bold">{{ \App\Models\Partner::where('type', 'Manufacturer')->count() }}</span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
@svg('heroicon-o-briefcase', 'w-6 h-6 text-orange-500')
|
||||
<span class="font-medium">{{ __('Makler') }}</span>
|
||||
</div>
|
||||
<span class="text-2xl font-bold">{{ \App\Models\Partner::whereIn('type', ['Broker', 'Estate-Agent'])->count() }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
{{-- Besucher-Statistik Chart --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Besucher-Statistik') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Tägliche Besucherzahlen der letzten Tage') }}</flux:subheading>
|
||||
|
||||
<div class="mt-6">
|
||||
@if(!empty($data))
|
||||
<flux:chart :value="$data" class="aspect-[3/1]">
|
||||
<flux:chart.svg>
|
||||
<flux:chart.line field="visitors" class="text-pink-500 dark:text-pink-400" />
|
||||
|
||||
<flux:chart.axis axis="x" field="date">
|
||||
<flux:chart.axis.line />
|
||||
<flux:chart.axis.tick />
|
||||
</flux:chart.axis>
|
||||
|
||||
<flux:chart.axis axis="y">
|
||||
<flux:chart.axis.grid />
|
||||
<flux:chart.axis.tick />
|
||||
</flux:chart.axis>
|
||||
|
||||
<flux:chart.cursor />
|
||||
</flux:chart.svg>
|
||||
|
||||
<flux:chart.tooltip>
|
||||
<flux:chart.tooltip.heading field="date" :format="['year' => 'numeric', 'month' => 'numeric', 'day' => 'numeric']" />
|
||||
<flux:chart.tooltip.value field="visitors" label="Besucher" />
|
||||
</flux:chart.tooltip>
|
||||
</flux:chart>
|
||||
@else
|
||||
<div class="text-center py-8 text-zinc-500 dark:text-zinc-400">
|
||||
{{ __('Keine Daten verfügbar') }}
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
|
||||
104
resources/views/admin/dashboards/broker.blade.php
Normal file
104
resources/views/admin/dashboards/broker.blade.php
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
<div class="space-y-6">
|
||||
{{-- KPI-Karten --}}
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
{{-- Verdiente Provision --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Verdiente Provision') }}</div>
|
||||
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ number_format($totalCommission, 2, ',', '.') }} €</div>
|
||||
<div class="text-xs text-green-600 dark:text-green-400 mt-1">{{ __('Lifetime Earnings (Platzhalter)') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-currency-euro', 'w-10 h-10 text-green-400 dark:text-green-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Offene Auszahlung --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Offene Auszahlung') }}</div>
|
||||
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ number_format($pendingPayout, 2, ',', '.') }} €</div>
|
||||
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ __('Platzhalter') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-banknotes', 'w-10 h-10 text-blue-400 dark:text-blue-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Generierte Leads --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-purple-700 dark:text-purple-300 font-medium">{{ __('Generierte Leads') }}</div>
|
||||
<div class="text-3xl font-bold text-purple-900 dark:text-purple-100 mt-2">{{ $generatedLeads }}</div>
|
||||
<div class="text-xs text-purple-600 dark:text-purple-400 mt-1">{{ __('Registrierte Kunden') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-user-group', 'w-10 h-10 text-purple-400 dark:text-purple-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
|
||||
{{-- Widgets --}}
|
||||
<div class="grid grid-cols-1 gap-6">
|
||||
{{-- Empfehlungs-Link --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Mein Empfehlungs-Link') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Teilen Sie diesen Link mit Ihren Kunden') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg border-2 border-dashed border-blue-300 dark:border-blue-700">
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="flex-1 bg-white dark:bg-zinc-800 px-4 py-3 rounded font-mono text-sm break-all">
|
||||
{{ $referralLink }}
|
||||
</div>
|
||||
<flux:button
|
||||
variant="primary"
|
||||
icon="clipboard"
|
||||
x-data
|
||||
@click="navigator.clipboard.writeText('{{ $referralLink }}'); $tooltip('{{ __('Link kopiert!') }}', { timeout: 2000 })"
|
||||
>
|
||||
{{ __('Kopieren') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 flex gap-2">
|
||||
<flux:button variant="ghost" size="sm" icon="chat-bubble-left">{{ __('Per WhatsApp teilen') }}</flux:button>
|
||||
<flux:button variant="ghost" size="sm" icon="envelope">{{ __('Per E-Mail teilen') }}</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
{{-- Meine Kunden --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Meine Kunden') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Über Sie registrierte Kunden') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 flex items-center justify-center py-8 bg-purple-50 dark:bg-purple-900/10 rounded-lg">
|
||||
<div class="text-center">
|
||||
<div class="text-5xl font-bold text-purple-600 dark:text-purple-400">{{ $brokerCustomers }}</div>
|
||||
<div class="text-sm text-purple-700 dark:text-purple-300 mt-2">{{ __('Registrierte Kunden') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Letzte Aktivitäten --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Letzte Aktivitäten') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Was ist neu?') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 space-y-2">
|
||||
<div class="p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg text-sm">
|
||||
<div class="font-medium">{{ __('Kunde Max M. hat sich registriert') }}</div>
|
||||
<div class="text-xs text-zinc-500 dark:text-zinc-400 mt-1">{{ __('vor 2 Stunden (Platzhalter)') }}</div>
|
||||
</div>
|
||||
<div class="p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg text-sm">
|
||||
<div class="font-medium">{{ __('Provision gutgeschrieben: 125,00 €') }}</div>
|
||||
<div class="text-xs text-zinc-500 dark:text-zinc-400 mt-1">{{ __('gestern (Platzhalter)') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
184
resources/views/admin/dashboards/customer.blade.php
Normal file
184
resources/views/admin/dashboards/customer.blade.php
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
<div class="space-y-6">
|
||||
{{-- Marken-Header mit Logo --}}
|
||||
<flux:card>
|
||||
<div class="flex flex-col md:flex-row items-center justify-between gap-6 p-6 rounded-lg"
|
||||
style="background: linear-gradient(135deg, {{ $customerBrandColors['primary'] ?? '#2b3f51' }}15 0%, {{ $customerBrandColors['secondary'] ?? '#20a0da' }}15 100%);">
|
||||
<div class="flex-1 text-center md:text-left">
|
||||
<div class="mb-4">
|
||||
<img src="{{ asset($customerBrandLogo) }}" alt="{{ $customerBrandName }}" class="h-12 mx-auto md:mx-0 dark:hidden">
|
||||
<img src="{{ asset(\App\Helpers\ThemeHelper::getLogoPathForBrand($customerBrand, 'negative')) }}" alt="{{ $customerBrandName }}" class="h-12 mx-auto md:mx-0 hidden dark:block">
|
||||
</div>
|
||||
<flux:heading size="xl">{{ __('Willkommen bei') }} {{ $customerBrandName }}!</flux:heading>
|
||||
<flux:subheading class="mt-2">{{ __('Ihr persönliches Kundenportal') }}</flux:subheading>
|
||||
@if($customerBrokerName)
|
||||
<div class="mt-3 flex items-center gap-2 justify-center md:justify-start">
|
||||
@svg('heroicon-o-user-circle', 'w-5 h-5 text-zinc-500 dark:text-zinc-400')
|
||||
<span class="text-sm text-zinc-600 dark:text-zinc-400">
|
||||
{{ __('Ihr Ansprechpartner:') }} <strong>{{ $customerBrokerName }}</strong>
|
||||
</span>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div class="flex-shrink-0">
|
||||
<div class="w-32 h-32 rounded-full flex items-center justify-center"
|
||||
style="background-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }}20;">
|
||||
@svg('heroicon-o-home', 'w-16 h-16', ['style' => 'color: ' . ($customerBrandColors['primary'] ?? '#2b3f51')])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Info-Box --}}
|
||||
<flux:card>
|
||||
<div class="p-4 rounded-lg" style="background-color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }}10;">
|
||||
<div class="flex items-start gap-3">
|
||||
@svg('heroicon-o-information-circle', 'w-6 h-6 flex-shrink-0', ['style' => 'color: ' . ($customerBrandColors['secondary'] ?? '#20a0da')])
|
||||
<div>
|
||||
<div class="font-medium" style="color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }};">
|
||||
{{ __('Ihr Dashboard wird bald erweitert') }}
|
||||
</div>
|
||||
<div class="text-sm text-zinc-700 dark:text-zinc-300 mt-1">
|
||||
{{ __('Hier sehen Sie bald Ihre Bestellungen, Wunschliste und Empfehlungen.') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Top-Angebote --}}
|
||||
@if(!empty($topOffers))
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-between mb-4">
|
||||
<div>
|
||||
<flux:heading size="lg">{{ __('Top-Angebote für Sie') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Exklusive Möbel zu besonderen Preisen') }}</flux:subheading>
|
||||
</div>
|
||||
<flux:button variant="ghost" size="sm" icon="arrow-right">
|
||||
{{ __('Alle Angebote') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mt-6">
|
||||
@foreach($topOffers as $offer)
|
||||
<div class="group relative overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-700 hover:shadow-lg transition-shadow duration-300">
|
||||
{{-- Produktbild --}}
|
||||
<div class="relative aspect-[4/3] overflow-hidden bg-zinc-100 dark:bg-zinc-800">
|
||||
<img src="{{ $offer['image'] }}"
|
||||
alt="{{ $offer['name'] }}"
|
||||
class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300">
|
||||
|
||||
{{-- Rabatt-Badge --}}
|
||||
@if($offer['discount'] > 0)
|
||||
<div class="absolute top-3 right-3 px-2 py-1 rounded-full text-xs font-bold text-white"
|
||||
style="background-color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }};">
|
||||
-{{ $offer['discount'] }}%
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- Kategorie-Badge --}}
|
||||
<div class="absolute top-3 left-3 px-2 py-1 rounded-full text-xs font-medium bg-white/90 dark:bg-zinc-900/90 text-zinc-700 dark:text-zinc-300">
|
||||
{{ $offer['category'] }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Produktinfo --}}
|
||||
<div class="p-4">
|
||||
<h3 class="font-semibold text-lg mb-2 text-zinc-900 dark:text-zinc-100">
|
||||
{{ $offer['name'] }}
|
||||
</h3>
|
||||
<p class="text-sm text-zinc-600 dark:text-zinc-400 mb-3">
|
||||
{{ $offer['description'] }}
|
||||
</p>
|
||||
|
||||
{{-- Preis --}}
|
||||
<div class="flex items-center gap-2 mb-4">
|
||||
<span class="text-2xl font-bold" style="color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }};">
|
||||
{{ number_format($offer['price'], 2, ',', '.') }} €
|
||||
</span>
|
||||
@if($offer['original_price'] > $offer['price'])
|
||||
<span class="text-sm text-zinc-500 dark:text-zinc-400 line-through">
|
||||
{{ number_format($offer['original_price'], 2, ',', '.') }} €
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
{{-- Aktions-Buttons --}}
|
||||
<div class="flex gap-2">
|
||||
<flux:button
|
||||
variant="primary"
|
||||
size="sm"
|
||||
icon="eye"
|
||||
class="flex-1"
|
||||
style="background-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }}; border-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }};">
|
||||
{{ __('Details') }}
|
||||
</flux:button>
|
||||
<flux:button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
icon="heart"
|
||||
style="color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }};">
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</flux:card>
|
||||
@endif
|
||||
|
||||
{{-- Feature-Vorschau --}}
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
<flux:card>
|
||||
<div class="p-4 text-center">
|
||||
<div class="w-16 h-16 rounded-full mx-auto mb-3 flex items-center justify-center"
|
||||
style="background-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }}20;">
|
||||
@svg('heroicon-o-shopping-bag', 'w-8 h-8', ['style' => 'color: ' . ($customerBrandColors['primary'] ?? '#2b3f51')])
|
||||
</div>
|
||||
<div class="font-medium text-lg">{{ __('Meine Bestellungen') }}</div>
|
||||
<div class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{{ __('Bald verfügbar') }}</div>
|
||||
<div class="mt-3">
|
||||
<flux:badge color="zinc" size="sm">{{ __('In Entwicklung') }}</flux:badge>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card>
|
||||
<div class="p-4 text-center">
|
||||
<div class="w-16 h-16 rounded-full mx-auto mb-3 flex items-center justify-center"
|
||||
style="background-color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }}20;">
|
||||
@svg('heroicon-o-heart', 'w-8 h-8', ['style' => 'color: ' . ($customerBrandColors['secondary'] ?? '#20a0da')])
|
||||
</div>
|
||||
<div class="font-medium text-lg">{{ __('Meine Wunschliste') }}</div>
|
||||
<div class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{{ __('Bald verfügbar') }}</div>
|
||||
<div class="mt-3">
|
||||
<flux:badge color="zinc" size="sm">{{ __('In Entwicklung') }}</flux:badge>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card>
|
||||
<div class="p-4 text-center">
|
||||
<div class="w-16 h-16 rounded-full mx-auto mb-3 flex items-center justify-center"
|
||||
style="background-color: {{ $customerBrandColors['accent'] ?? ($customerBrandColors['secondary'] ?? '#20a0da') }}20;">
|
||||
@svg('heroicon-o-star', 'w-8 h-8', ['style' => 'color: ' . ($customerBrandColors['accent'] ?? ($customerBrandColors['secondary'] ?? '#20a0da'))])
|
||||
</div>
|
||||
<div class="font-medium text-lg">{{ __('Empfehlungen') }}</div>
|
||||
<div class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{{ __('Bald verfügbar') }}</div>
|
||||
<div class="mt-3">
|
||||
<flux:badge color="zinc" size="sm">{{ __('In Entwicklung') }}</flux:badge>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
|
||||
{{-- Marken-Info Footer --}}
|
||||
<flux:card>
|
||||
<div class="text-center py-6">
|
||||
<div class="text-sm text-zinc-600 dark:text-zinc-400">
|
||||
{{ __('Powered by') }}
|
||||
</div>
|
||||
<img src="{{ asset($customerBrandLogo) }}" alt="{{ $customerBrandName }}" class="h-8 mx-auto mt-2 opacity-60 dark:hidden">
|
||||
<img src="{{ asset(\App\Helpers\ThemeHelper::getLogoPathForBrand($customerBrand, 'negative')) }}" alt="{{ $customerBrandName }}" class="h-8 mx-auto mt-2 opacity-60 hidden dark:block">
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
95
resources/views/admin/dashboards/manufacturer.blade.php
Normal file
95
resources/views/admin/dashboards/manufacturer.blade.php
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
<div class="space-y-6">
|
||||
{{-- KPI-Karten --}}
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
{{-- Marken-Reichweite --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-purple-700 dark:text-purple-300 font-medium">{{ __('Marken-Reichweite') }}</div>
|
||||
<div class="text-3xl font-bold text-purple-900 dark:text-purple-100 mt-2">{{ $brandReach }}</div>
|
||||
<div class="text-xs text-purple-600 dark:text-purple-400 mt-1">{{ __('Händler führen meine Produkte') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-globe-alt', 'w-10 h-10 text-purple-400 dark:text-purple-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Katalog-Status --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Katalog-Status') }}</div>
|
||||
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ $activeProducts }}</div>
|
||||
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ $draftProducts }} {{ __('Entwürfe') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-cube', 'w-10 h-10 text-blue-400 dark:text-blue-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Gesamt-Views --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Gesamt-Views') }}</div>
|
||||
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ number_format($totalViews, 0, ',', '.') }}</div>
|
||||
<div class="text-xs text-green-600 dark:text-green-400 mt-1">{{ __('Platzhalter') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-eye', 'w-10 h-10 text-green-400 dark:text-green-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
|
||||
{{-- Widgets --}}
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
{{-- Katalog-Pflege --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Katalog-Pflege') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Verwalten Sie Ihre Produkte') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 space-y-3">
|
||||
<div class="flex items-center justify-between p-3 bg-green-50 dark:bg-green-900/10 rounded-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
@svg('heroicon-o-check-circle', 'w-5 h-5 text-green-500')
|
||||
<span>{{ __('Aktive Produkte') }}</span>
|
||||
</div>
|
||||
<span class="font-bold text-lg">{{ $activeProducts }}</span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between p-3 bg-orange-50 dark:bg-orange-900/10 rounded-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
@svg('heroicon-o-pencil', 'w-5 h-5 text-orange-500')
|
||||
<span>{{ __('Entwürfe') }}</span>
|
||||
</div>
|
||||
<span class="font-bold text-lg">{{ $draftProducts }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
<flux:button variant="primary" size="sm" icon="plus">{{ __('Neues Produkt (Master)') }}</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Schnellzugriff --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Schnellzugriff') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Häufig benötigte Funktionen') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 space-y-2">
|
||||
<flux:button variant="ghost" icon="photo" class="w-full justify-start">
|
||||
{{ __('Marketing-Material hochladen') }}
|
||||
</flux:button>
|
||||
<flux:button variant="ghost" icon="chart-bar" class="w-full justify-start">
|
||||
{{ __('Händler-Performance') }} ({{ __('Platzhalter') }})
|
||||
</flux:button>
|
||||
<flux:button variant="ghost" icon="tag" class="w-full justify-start">
|
||||
{{ __('Meine Marke bearbeiten') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
95
resources/views/admin/dashboards/retailer.blade.php
Normal file
95
resources/views/admin/dashboards/retailer.blade.php
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
<div class="space-y-6">
|
||||
{{-- KPI-Karten --}}
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
{{-- Offene Bestellungen --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-red-700 dark:text-red-300 font-medium">{{ __('Offene Bestellungen') }}</div>
|
||||
<div class="text-3xl font-bold text-red-900 dark:text-red-100 mt-2">{{ $openOrders }}</div>
|
||||
<div class="text-xs text-red-600 dark:text-red-400 mt-1">{{ __('Platzhalter') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-shopping-cart', 'w-10 h-10 text-red-400 dark:text-red-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Umsatz --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Umsatz diesen Monat') }}</div>
|
||||
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ number_format($monthlyRevenue, 0, ',', '.') }} €</div>
|
||||
<div class="text-xs text-green-600 dark:text-green-400 mt-1">{{ __('Platzhalter') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-currency-euro', 'w-10 h-10 text-green-400 dark:text-green-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Produkt-Views --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Produkt-Views') }}</div>
|
||||
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ number_format($productViews, 0, ',', '.') }}</div>
|
||||
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ __('Platzhalter') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-eye', 'w-10 h-10 text-blue-400 dark:text-blue-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Lager-Warnungen --}}
|
||||
<flux:card>
|
||||
<div class="flex items-start justify-between">
|
||||
<div>
|
||||
<div class="text-sm text-orange-700 dark:text-orange-300 font-medium">{{ __('Lager-Warnungen') }}</div>
|
||||
<div class="text-3xl font-bold text-orange-900 dark:text-orange-100 mt-2">{{ $stockWarnings }}</div>
|
||||
<div class="text-xs text-orange-600 dark:text-orange-400 mt-1">{{ __('Platzhalter') }}</div>
|
||||
</div>
|
||||
@svg('heroicon-o-exclamation-triangle', 'w-10 h-10 text-orange-400 dark:text-orange-600')
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
|
||||
{{-- Widgets --}}
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
{{-- To-Do Liste --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('To-Do Liste') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Ihre anstehenden Aufgaben') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 space-y-2">
|
||||
<div class="flex items-center gap-3 p-3 bg-red-50 dark:bg-red-900/10 rounded-lg">
|
||||
@svg('heroicon-o-shopping-cart', 'w-5 h-5 text-red-500')
|
||||
<span class="font-medium">{{ $openOrders }} {{ __('neue Bestellungen warten') }}</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/10 rounded-lg">
|
||||
@svg('heroicon-o-chat-bubble-left-right', 'w-5 h-5 text-blue-500')
|
||||
<span class="font-medium">{{ __('2 Kundenfragen offen') }} ({{ __('Platzhalter') }})</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-3 p-3 bg-orange-50 dark:bg-orange-900/10 rounded-lg">
|
||||
@svg('heroicon-o-cube', 'w-5 h-5 text-orange-500')
|
||||
<span class="font-medium">{{ $stockWarnings }} {{ __('Lager-Warnungen') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 flex gap-2">
|
||||
<flux:button variant="primary" size="sm" icon="plus">{{ __('Neues Produkt') }}</flux:button>
|
||||
<flux:button variant="ghost" size="sm" icon="arrow-path">{{ __('Bestände aktualisieren') }}</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
{{-- Meine Kunden --}}
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Meine Kunden') }}</flux:heading>
|
||||
<flux:subheading>{{ __('Kunden in Ihrem Einzugsgebiet') }}</flux:subheading>
|
||||
|
||||
<div class="mt-4 flex items-center justify-center py-8 bg-blue-50 dark:bg-blue-900/10 rounded-lg">
|
||||
<div class="text-center">
|
||||
<div class="text-5xl font-bold text-blue-600 dark:text-blue-400">{{ $myCustomers }}</div>
|
||||
<div class="text-sm text-blue-700 dark:text-blue-300 mt-2">{{ __('zugeordnete Kunden') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue