Rebrand Hub+Flux
This commit is contained in:
parent
0a3e52d603
commit
9b47296cea
130 changed files with 9357 additions and 3345 deletions
|
|
@ -131,6 +131,25 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
$this->clearContactFilter();
|
||||
}
|
||||
|
||||
public function setView(string $view): void
|
||||
{
|
||||
$this->statusFilter = $view;
|
||||
$this->resetPage();
|
||||
}
|
||||
|
||||
public function resetFilters(): void
|
||||
{
|
||||
$this->search = '';
|
||||
$this->statusFilter = 'all';
|
||||
$this->portalFilter = 'all';
|
||||
$this->languageFilter = 'all';
|
||||
$this->categoryFilter = 'all';
|
||||
$this->clearUserFilter();
|
||||
$this->clearCompanyFilter();
|
||||
$this->clearContactFilter();
|
||||
$this->resetPage();
|
||||
}
|
||||
|
||||
public function publish(int $id): void
|
||||
{
|
||||
$pr = PressRelease::withoutGlobalScopes()->findOrFail($id);
|
||||
|
|
@ -222,7 +241,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
}
|
||||
|
||||
/**
|
||||
* @return array{total: int, published: int, review: int, draft: int}
|
||||
* @return array{total: int, published: int, review: int, draft: int, rejected: int, archived: int}
|
||||
*/
|
||||
private function pressReleaseStats(): array
|
||||
{
|
||||
|
|
@ -233,6 +252,8 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
->selectRaw('SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as published', [PressReleaseStatus::Published->value])
|
||||
->selectRaw('SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as review', [PressReleaseStatus::Review->value])
|
||||
->selectRaw('SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as draft', [PressReleaseStatus::Draft->value])
|
||||
->selectRaw('SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as rejected', [PressReleaseStatus::Rejected->value])
|
||||
->selectRaw('SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as archived', [PressReleaseStatus::Archived->value])
|
||||
->first();
|
||||
|
||||
return [
|
||||
|
|
@ -240,6 +261,8 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
'published' => (int) ($stats->published ?? 0),
|
||||
'review' => (int) ($stats->review ?? 0),
|
||||
'draft' => (int) ($stats->draft ?? 0),
|
||||
'rejected' => (int) ($stats->rejected ?? 0),
|
||||
'archived' => (int) ($stats->archived ?? 0),
|
||||
];
|
||||
});
|
||||
}
|
||||
|
|
@ -405,6 +428,34 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
</x-portal.stat-card>
|
||||
</section>
|
||||
|
||||
{{-- ============== SAVED-VIEWS-TABS ============== --}}
|
||||
<nav class="view-tabs" aria-label="{{ __('Gespeicherte Ansichten') }}">
|
||||
<button type="button" wire:click="setView('all')"
|
||||
@class(['view-tab', 'is-active' => $statusFilter === 'all'])>
|
||||
{{ __('Alle') }} <span class="cnt">{{ number_format($stats['total']) }}</span>
|
||||
</button>
|
||||
<button type="button" wire:click="setView('{{ \App\Enums\PressReleaseStatus::Review->value }}')"
|
||||
@class(['view-tab', 'is-active' => $statusFilter === \App\Enums\PressReleaseStatus::Review->value])>
|
||||
{{ __('In Prüfung') }} <span class="cnt">{{ number_format($stats['review']) }}</span>
|
||||
</button>
|
||||
<button type="button" wire:click="setView('{{ \App\Enums\PressReleaseStatus::Published->value }}')"
|
||||
@class(['view-tab', 'is-active' => $statusFilter === \App\Enums\PressReleaseStatus::Published->value])>
|
||||
{{ __('Veröffentlicht') }} <span class="cnt">{{ number_format($stats['published']) }}</span>
|
||||
</button>
|
||||
<button type="button" wire:click="setView('{{ \App\Enums\PressReleaseStatus::Draft->value }}')"
|
||||
@class(['view-tab', 'is-active' => $statusFilter === \App\Enums\PressReleaseStatus::Draft->value])>
|
||||
{{ __('Entwürfe') }} <span class="cnt">{{ number_format($stats['draft']) }}</span>
|
||||
</button>
|
||||
<button type="button" wire:click="setView('{{ \App\Enums\PressReleaseStatus::Rejected->value }}')"
|
||||
@class(['view-tab', 'is-active' => $statusFilter === \App\Enums\PressReleaseStatus::Rejected->value])>
|
||||
{{ __('Abgelehnt') }} <span class="cnt">{{ number_format($stats['rejected'] ?? 0) }}</span>
|
||||
</button>
|
||||
<button type="button" wire:click="setView('{{ \App\Enums\PressReleaseStatus::Archived->value }}')"
|
||||
@class(['view-tab', 'is-active' => $statusFilter === \App\Enums\PressReleaseStatus::Archived->value])>
|
||||
{{ __('Archiv') }} <span class="cnt">{{ number_format($stats['archived'] ?? 0) }}</span>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
{{-- ============== FILTER-PANEL ============== --}}
|
||||
<article class="panel">
|
||||
<div class="panel-head">
|
||||
|
|
@ -444,7 +495,9 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
<flux:select wire:model.live="categoryFilter" class="w-full">
|
||||
<option value="all">{{ __('Alle Kategorien') }}</option>
|
||||
@foreach ($categoryOptions as $categoryOption)
|
||||
@php($categoryName = $categoryOption->translations->firstWhere('locale', 'de')?->name ?? '#' . $categoryOption->id)
|
||||
@php
|
||||
$categoryName = $categoryOption->translations->firstWhere('locale', 'de')?->name ?? '#'.$categoryOption->id;
|
||||
@endphp
|
||||
<option value="{{ $categoryOption->id }}">{{ $categoryName }}</option>
|
||||
@endforeach
|
||||
</flux:select>
|
||||
|
|
@ -548,7 +601,9 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
|
||||
<flux:select.option value="all">{{ __('Alle Kontakte') }}</flux:select.option>
|
||||
@foreach($contactLookupResults as $contactOption)
|
||||
@php($contactName = trim(($contactOption->first_name ?? '').' '.($contactOption->last_name ?? '')) ?: __('Kontakt ohne Name'))
|
||||
@php
|
||||
$contactName = trim(($contactOption->first_name ?? '').' '.($contactOption->last_name ?? '')) ?: __('Kontakt ohne Name');
|
||||
@endphp
|
||||
<flux:select.option :value="$contactOption->id" wire:key="pm-contact-{{ $contactOption->id }}">
|
||||
{{ $contactName }}
|
||||
<span class="ml-1 text-zinc-400">
|
||||
|
|
@ -575,6 +630,154 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Active-Chips --}}
|
||||
@php
|
||||
$hasAnyFilter = $search !== ''
|
||||
|| $statusFilter !== 'all'
|
||||
|| $portalFilter !== 'all'
|
||||
|| $languageFilter !== 'all'
|
||||
|| $categoryFilter !== 'all'
|
||||
|| $userFilter !== 'all'
|
||||
|| $companyFilter !== 'all'
|
||||
|| $contactFilter !== 'all';
|
||||
@endphp
|
||||
@if ($hasAnyFilter)
|
||||
<div class="flex items-center gap-2 flex-wrap text-[11.5px] pt-1">
|
||||
<span class="eyebrow muted" style="margin-right:2px;">{{ __('Aktiv') }}</span>
|
||||
|
||||
@if ($search !== '')
|
||||
<span class="active-chip">
|
||||
<span>{{ __('Suche') }}:
|
||||
<strong>„{{ \Illuminate\Support\Str::limit($search, 40) }}"</strong></span>
|
||||
<button type="button" class="x" wire:click="$set('search', '')"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if ($statusFilter !== 'all')
|
||||
@php $statusEnum = \App\Enums\PressReleaseStatus::tryFrom($statusFilter); @endphp
|
||||
<span class="active-chip">
|
||||
<span>{{ __('Status') }}:
|
||||
<strong>{{ $statusEnum?->label() ?? $statusFilter }}</strong></span>
|
||||
<button type="button" class="x" wire:click="setView('all')"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if ($portalFilter !== 'all')
|
||||
@php $portalEnum = \App\Enums\Portal::tryFrom($portalFilter); @endphp
|
||||
<span class="active-chip">
|
||||
<span>{{ __('Portal') }}:
|
||||
<strong>{{ $portalEnum?->label() ?? $portalFilter }}</strong></span>
|
||||
<button type="button" class="x" wire:click="$set('portalFilter', 'all')"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if ($languageFilter !== 'all')
|
||||
<span class="active-chip">
|
||||
<span>{{ __('Sprache') }}:
|
||||
<strong>{{ strtoupper($languageFilter) }}</strong></span>
|
||||
<button type="button" class="x" wire:click="$set('languageFilter', 'all')"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if ($categoryFilter !== 'all')
|
||||
@php
|
||||
$activeCat = $categoryOptions->firstWhere('id', (int) $categoryFilter);
|
||||
$activeCatName = $activeCat?->translations->firstWhere('locale', 'de')?->name
|
||||
?? '#'.$categoryFilter;
|
||||
@endphp
|
||||
<span class="active-chip">
|
||||
<span>{{ __('Kategorie') }}: <strong>{{ $activeCatName }}</strong></span>
|
||||
<button type="button" class="x" wire:click="$set('categoryFilter', 'all')"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if ($userFilter !== 'all')
|
||||
@php $activeUser = $userLookupResults->firstWhere('id', (int) $userFilter); @endphp
|
||||
<span class="active-chip">
|
||||
<span>{{ __('User') }}:
|
||||
<strong>{{ $activeUser?->name ?? '#'.$userFilter }}</strong></span>
|
||||
<button type="button" class="x" wire:click="clearUserFilter"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if ($companyFilter !== 'all')
|
||||
@php $activeCompany = $companyLookupResults->firstWhere('id', (int) $companyFilter); @endphp
|
||||
<span class="active-chip">
|
||||
<span>{{ __('Firma') }}:
|
||||
<strong>{{ $activeCompany?->name ?? '#'.$companyFilter }}</strong></span>
|
||||
<button type="button" class="x" wire:click="clearCompanyFilter"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if ($contactFilter !== 'all')
|
||||
@php
|
||||
$activeContact = $contactLookupResults->firstWhere('id', (int) $contactFilter);
|
||||
$contactName = $activeContact
|
||||
? trim(($activeContact->first_name ?? '').' '.($activeContact->last_name ?? ''))
|
||||
: '';
|
||||
$contactName = $contactName !== '' ? $contactName : '#'.$contactFilter;
|
||||
@endphp
|
||||
<span class="active-chip">
|
||||
<span>{{ __('Kontakt') }}: <strong>{{ $contactName }}</strong></span>
|
||||
<button type="button" class="x" wire:click="clearContactFilter"
|
||||
aria-label="{{ __('Filter entfernen') }}">
|
||||
<svg width="8" height="8" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 3l6 6M9 3l-6 6" stroke="currentColor" stroke-width="1.6"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
<button type="button" wire:click="resetFilters"
|
||||
class="text-[11.5px] font-semibold text-[color:var(--color-ink-3)] hover:text-[color:var(--color-hub)] underline-offset-[3px] hover:underline">
|
||||
{{ __('Alle zurücksetzen') }}
|
||||
</button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</article>
|
||||
|
||||
|
|
@ -588,86 +791,135 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
</div>
|
||||
<flux:table>
|
||||
<flux:table.columns>
|
||||
<flux:table.column>{{ __('Aktionen') }}</flux:table.column>
|
||||
|
||||
<flux:table.column class="w-[200px]" sortable :sorted="$sortBy === 'status'" :direction="$sortDir"
|
||||
wire:click="sort('status')">{{ __('Status') }}</flux:table.column>
|
||||
<flux:table.column sortable :sorted="$sortBy === 'title'" :direction="$sortDir"
|
||||
wire:click="sort('title')">{{ __('Titel') }}</flux:table.column>
|
||||
<flux:table.column sortable :sorted="$sortBy === 'created_at'" :direction="$sortDir"
|
||||
wire:click="sort('created_at')">{{ __('Erstellt') }}</flux:table.column>
|
||||
<flux:table.column>{{ __('Kategorie') }}</flux:table.column>
|
||||
<flux:table.column sortable :sorted="$sortBy === 'status'" :direction="$sortDir"
|
||||
wire:click="sort('status')">{{ __('Status') }}</flux:table.column>
|
||||
<flux:table.column sortable :sorted="$sortBy === 'portal'" :direction="$sortDir"
|
||||
wire:click="sort('portal')">{{ __('Portal') }}</flux:table.column>
|
||||
<flux:table.column sortable :sorted="$sortBy === 'hits'" :direction="$sortDir"
|
||||
wire:click="sort('hits')">
|
||||
{{ __('Hits') }}</flux:table.column>
|
||||
<flux:table.column>{{ __('Aktionen') }}</flux:table.column>
|
||||
|
||||
<flux:table.column class="w-[200px]" sortable :sorted="$sortBy === 'portal'"
|
||||
:direction="$sortDir" wire:click="sort('portal')">{{ __('Portal') }}</flux:table.column>
|
||||
<flux:table.column class="w-[180px]">{{ __('Kategorie') }}</flux:table.column>
|
||||
<flux:table.column class="w-[130px]" sortable :sorted="$sortBy === 'created_at'"
|
||||
:direction="$sortDir" wire:click="sort('created_at')">{{ __('Datum') }}</flux:table.column>
|
||||
<flux:table.column class="w-[80px]" sortable :sorted="$sortBy === 'hits'" :direction="$sortDir"
|
||||
wire:click="sort('hits')">{{ __('Hits') }}</flux:table.column>
|
||||
<flux:table.column class="w-[90px]">{{ __('Aktionen') }}</flux:table.column>
|
||||
</flux:table.columns>
|
||||
|
||||
@forelse($pressReleases as $pr)
|
||||
<flux:table.row wire:key="{{ $pr->id }}">
|
||||
@php
|
||||
$status = $pr->status->value;
|
||||
$rowClass = match ($status) {
|
||||
'review' => 'is-row-warn',
|
||||
'rejected' => 'is-row-err',
|
||||
default => '',
|
||||
};
|
||||
$badgeClass = match ($status) {
|
||||
'published' => 'ok',
|
||||
'review' => 'warn',
|
||||
'rejected' => 'err',
|
||||
'archived', 'draft' => 'muted',
|
||||
default => 'hub',
|
||||
};
|
||||
$portal = $pr->portal?->value ?? 'both';
|
||||
$showPe = in_array($portal, ['presseecho', 'both'], true);
|
||||
$showBp = in_array($portal, ['businessportal24', 'both'], true);
|
||||
$dateSubLabel = match ($status) {
|
||||
'published' => __('veröffentlicht'),
|
||||
'review' => __('eingereicht'),
|
||||
'rejected' => __('abgelehnt'),
|
||||
'draft' => __('erstellt'),
|
||||
'archived' => __('archiviert'),
|
||||
default => __('erstellt'),
|
||||
};
|
||||
$primaryDate = $status === 'published' && $pr->published_at
|
||||
? $pr->published_at
|
||||
: $pr->created_at;
|
||||
@endphp
|
||||
<flux:table.row wire:key="{{ $pr->id }}" class="{{ $rowClass }}">
|
||||
<flux:table.cell>
|
||||
<div class="flex items-center gap-1.5 flex-wrap">
|
||||
<span class="badge {{ $badgeClass }} dot">{{ $pr->status->label() }}</span>
|
||||
@if ($pr->status === \App\Enums\PressReleaseStatus::Review)
|
||||
<flux:modal.trigger name="confirm-index-publish-{{ $pr->id }}">
|
||||
<button type="button" class="inline-action"
|
||||
title="{{ __('Pressemitteilung veröffentlichen') }}">
|
||||
{{ __('Freigeben →') }}
|
||||
</button>
|
||||
</flux:modal.trigger>
|
||||
<flux:modal.trigger name="confirm-index-reject-{{ $pr->id }}">
|
||||
<button type="button" class="inline-action err"
|
||||
title="{{ __('Pressemitteilung ablehnen') }}">
|
||||
{{ __('Ablehnen →') }}
|
||||
</button>
|
||||
</flux:modal.trigger>
|
||||
@elseif ($pr->status === \App\Enums\PressReleaseStatus::Published)
|
||||
<flux:modal.trigger name="confirm-index-archive-{{ $pr->id }}">
|
||||
<button type="button" class="inline-action warn"
|
||||
title="{{ __('Pressemitteilung archivieren') }}">
|
||||
{{ __('Archivieren →') }}
|
||||
</button>
|
||||
</flux:modal.trigger>
|
||||
@endif
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
|
||||
<flux:table.cell>
|
||||
<a href="{{ route('admin.press-releases.show', $pr->id) }}" wire:navigate
|
||||
class="block font-semibold text-[13.5px] leading-[1.35] text-[color:var(--color-ink)] hover:text-[color:var(--color-hub)] hover:underline underline-offset-[3px] decoration-[color:var(--color-hub)]/40 hover:decoration-[color:var(--color-hub)] truncate">
|
||||
{{ $pr->title ?? '—' }}
|
||||
</a>
|
||||
<div class="text-[11.5px] text-[color:var(--color-ink-3)] mt-0.5 leading-[1.4]">
|
||||
PM-{{ $pr->id }}
|
||||
@if ($pr->company)
|
||||
· {{ $pr->company->name }}
|
||||
@endif
|
||||
· {{ strtoupper($pr->language) }}
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
|
||||
<flux:table.cell>
|
||||
<div class="flex flex-wrap gap-1">
|
||||
@if ($showPe)
|
||||
<span class="portal-pill pe"><span class="pdot"></span>presseecho</span>
|
||||
@endif
|
||||
@if ($showBp)
|
||||
<span class="portal-pill bp"><span class="pdot"></span>businessportal24</span>
|
||||
@endif
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
|
||||
<flux:table.cell>
|
||||
@php
|
||||
$categoryName = $pr->category?->translations->firstWhere('locale', 'de')?->name ?? '–';
|
||||
@endphp
|
||||
<span class="text-[12px] text-[color:var(--color-ink-2)] truncate block"
|
||||
title="{{ $categoryName }}">
|
||||
{{ $categoryName }}
|
||||
</span>
|
||||
</flux:table.cell>
|
||||
|
||||
<flux:table.cell>
|
||||
<div class="font-mono text-[12px] text-[color:var(--color-ink-2)] tabular-nums">
|
||||
{{ $primaryDate?->format('d.m.Y') }}
|
||||
</div>
|
||||
<div class="text-[10.5px] text-[color:var(--color-ink-4)] mt-0.5">
|
||||
{{ $dateSubLabel }} · {{ $primaryDate?->format('H:i') }}
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
|
||||
<flux:table.cell>
|
||||
<span
|
||||
class="font-mono text-[12px] text-[color:var(--color-ink-2)] tabular-nums">{{ number_format($pr->hits) }}</span>
|
||||
</flux:table.cell>
|
||||
|
||||
<flux:table.cell>
|
||||
<div class="flex items-center gap-1">
|
||||
<flux:button size="sm" variant="ghost" icon="eye"
|
||||
href="{{ route('admin.press-releases.show', $pr->id) }}" wire:navigate />
|
||||
href="{{ route('admin.press-releases.show', $pr->id) }}" wire:navigate
|
||||
title="{{ __('Ansehen') }}" />
|
||||
<flux:button size="sm" variant="ghost" icon="pencil"
|
||||
href="{{ route('admin.press-releases.edit', $pr->id) }}" wire:navigate />
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<div class="max-w-xs">
|
||||
<p class="truncate font-medium">{{ $pr->title ?? '–' }}</p>
|
||||
<p class="text-sm truncate text-zinc-400">
|
||||
{{ $pr->company?->name ?? '–' . ' | ' . strtoupper($pr->language) }}
|
||||
</p>
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<flux:text class="text-sm text-zinc-500">{{ $pr->created_at->format('d.m.Y H:i') }}</flux:text>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
@php($categoryName = $pr->category?->translations->firstWhere('locale', 'de')?->name ?? '–')
|
||||
<div class="max-w-48">
|
||||
<flux:text class="truncate text-sm" title="{{ $categoryName }}">{{ $categoryName }}
|
||||
</flux:text>
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<span @class([
|
||||
'badge',
|
||||
'ok' => $pr->status->value === 'published',
|
||||
'warn' => $pr->status->value === 'review',
|
||||
'err' => $pr->status->value === 'rejected',
|
||||
'hub' => in_array($pr->status->value, ['archived', 'draft'], true),
|
||||
])>
|
||||
{{ $pr->status->label() }}
|
||||
</span>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<flux:text class="text-sm">{{ $pr->portal->label() }}</flux:text>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<flux:text class="text-sm">{{ number_format($pr->hits) }}</flux:text>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<div class="flex items-center gap-1">
|
||||
@if ($pr->status === \App\Enums\PressReleaseStatus::Review)
|
||||
<flux:modal.trigger name="confirm-index-publish-{{ $pr->id }}">
|
||||
<flux:button size="sm" variant="ghost" icon="check-circle"
|
||||
class="text-green-600" />
|
||||
</flux:modal.trigger>
|
||||
<flux:modal.trigger name="confirm-index-reject-{{ $pr->id }}">
|
||||
<flux:button size="sm" variant="ghost" icon="x-circle" class="text-red-600" />
|
||||
</flux:modal.trigger>
|
||||
@endif
|
||||
@if ($pr->status === \App\Enums\PressReleaseStatus::Published)
|
||||
<flux:modal.trigger name="confirm-index-archive-{{ $pr->id }}">
|
||||
<flux:button size="sm" variant="ghost" icon="archive-box"
|
||||
class="text-zinc-500" />
|
||||
</flux:modal.trigger>
|
||||
@endif
|
||||
href="{{ route('admin.press-releases.edit', $pr->id) }}" wire:navigate
|
||||
title="{{ __('Bearbeiten') }}" />
|
||||
</div>
|
||||
|
||||
@if ($pr->status === \App\Enums\PressReleaseStatus::Review)
|
||||
|
|
@ -733,19 +985,44 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
|||
</flux:table.row>
|
||||
@empty
|
||||
<flux:table.row>
|
||||
<flux:table.cell colspan="8">
|
||||
<div class="flex flex-col items-center justify-center py-12 text-center">
|
||||
<div class="w-14 h-14 rounded-[6px] flex items-center justify-center mb-4
|
||||
bg-[color:var(--color-hub-soft)] border border-[color:var(--color-hub-soft-2)] text-[color:var(--color-hub)]">
|
||||
<flux:icon.newspaper class="size-6" />
|
||||
<flux:table.cell colspan="7">
|
||||
@if ($hasAnyFilter)
|
||||
<div class="empty-stage">
|
||||
<div class="empty-ico warm">
|
||||
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
|
||||
<path d="M4 6h16M7 12h10M10 18h4" stroke="currentColor" stroke-width="1.8"
|
||||
stroke-linecap="round" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="empty-title">
|
||||
{{ __('Keine Pressemitteilungen mit diesen Filtern') }}
|
||||
</h3>
|
||||
<p class="empty-sub">
|
||||
{{ __('Passen Sie die Filter an oder setzen Sie alle Filter zurück, um wieder alle PMs zu sehen.') }}
|
||||
</p>
|
||||
<div class="flex items-center gap-2.5 mt-6">
|
||||
<flux:button variant="primary" wire:click="resetFilters">
|
||||
{{ __('Filter zurücksetzen') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-[14px] font-semibold text-[color:var(--color-ink)] mb-1">
|
||||
{{ __('Keine Pressemitteilungen gefunden') }}
|
||||
@else
|
||||
<div class="empty-stage">
|
||||
<div class="empty-ico">
|
||||
<flux:icon.newspaper class="size-7" />
|
||||
</div>
|
||||
<h3 class="empty-title">{{ __('Noch keine Pressemitteilungen') }}</h3>
|
||||
<p class="empty-sub">
|
||||
{{ __('Sobald Kunden PMs anlegen oder einreichen, erscheinen sie hier zur Bearbeitung.') }}
|
||||
</p>
|
||||
<div class="flex items-center gap-2.5 mt-6">
|
||||
<flux:button variant="primary" icon="plus"
|
||||
href="{{ route('admin.press-releases.create') }}" wire:navigate>
|
||||
{{ __('Neue PM anlegen') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-[12px] text-[color:var(--color-ink-3)] max-w-md m-0">
|
||||
{{ __('Passen Sie die Filter an oder erstellen Sie eine neue Pressemitteilung.') }}
|
||||
</p>
|
||||
</div>
|
||||
@endif
|
||||
</flux:table.cell>
|
||||
</flux:table.row>
|
||||
@endforelse
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue