12-05-2026 Frontend dev
This commit is contained in:
parent
405df0a122
commit
5b8bdf4182
779 changed files with 480564 additions and 6241 deletions
201
resources/views/livewire/admin/footer-codes/create.blade.php
Normal file
201
resources/views/livewire/admin/footer-codes/create.blade.php
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
<?php
|
||||
|
||||
use App\Enums\Portal;
|
||||
use App\Models\Category;
|
||||
use App\Models\FooterCode;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Livewire\Attributes\Layout;
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Volt\Component;
|
||||
|
||||
new #[Layout('components.layouts.app'), Title('Footer-Code anlegen')] class extends Component
|
||||
{
|
||||
#[Validate('required|string|min:2|max:255')]
|
||||
public string $title = '';
|
||||
|
||||
#[Validate('required|string|min:5')]
|
||||
public string $content = '';
|
||||
|
||||
#[Validate('required|in:'.Portal::Both->value.','.Portal::Presseecho->value.','.Portal::Businessportal24->value)]
|
||||
public string $portal = Portal::Both->value;
|
||||
|
||||
#[Validate('nullable|in:de,en')]
|
||||
public ?string $language = null;
|
||||
|
||||
public bool $isGlobal = false;
|
||||
|
||||
public bool $isActive = true;
|
||||
|
||||
#[Validate('integer|min:0|max:1000')]
|
||||
public int $priority = 0;
|
||||
|
||||
/** @var array<int, int> */
|
||||
public array $categoryIds = [];
|
||||
|
||||
public function save(): void
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
DB::transaction(function (): void {
|
||||
$code = FooterCode::create([
|
||||
'title' => $this->title,
|
||||
'content' => $this->content,
|
||||
'portal' => $this->portal,
|
||||
'language' => $this->language,
|
||||
'is_global' => $this->isGlobal,
|
||||
'is_active' => $this->isActive,
|
||||
'priority' => $this->priority,
|
||||
]);
|
||||
|
||||
if (! $this->isGlobal && ! empty($this->categoryIds)) {
|
||||
$code->categories()->sync($this->categoryIds);
|
||||
}
|
||||
});
|
||||
|
||||
session()->flash('success', __('Footer-Code wurde angelegt.'));
|
||||
|
||||
$this->redirect(route('admin.footer-codes.index'), navigate: true);
|
||||
}
|
||||
|
||||
public function with(): array
|
||||
{
|
||||
return [
|
||||
'portalOptions' => Portal::cases(),
|
||||
'categoryOptions' => Category::query()
|
||||
->with(['translations' => fn ($q) => $q->where('locale', 'de')])
|
||||
->orderBy('id')
|
||||
->get()
|
||||
->map(fn (Category $cat) => [
|
||||
'id' => $cat->id,
|
||||
'name' => $cat->translations->first()?->name ?? '#'.$cat->id,
|
||||
'portal' => $cat->portal->value,
|
||||
]),
|
||||
];
|
||||
}
|
||||
}; ?>
|
||||
|
||||
<div class="space-y-6">
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ __('Footer-Code anlegen') }}</flux:heading>
|
||||
<flux:subheading>
|
||||
{{ __('Snippet, das unter Pressemitteilungen ausgespielt wird.') }}
|
||||
</flux:subheading>
|
||||
</div>
|
||||
<flux:button
|
||||
variant="ghost"
|
||||
icon="arrow-left"
|
||||
:href="route('admin.footer-codes.index')"
|
||||
wire:navigate
|
||||
>
|
||||
{{ __('Zurück') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<form wire:submit="save" class="space-y-6">
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Stammdaten') }}</flux:heading>
|
||||
|
||||
<div class="mt-4 space-y-4">
|
||||
<flux:input
|
||||
wire:model="title"
|
||||
:label="__('Titel')"
|
||||
placeholder="z. B. {{ __('Standard-Disclaimer DE') }}"
|
||||
/>
|
||||
|
||||
<flux:textarea
|
||||
wire:model="content"
|
||||
:label="__('HTML-/Text-Inhalt')"
|
||||
rows="10"
|
||||
placeholder="<p>…</p>"
|
||||
/>
|
||||
|
||||
<div class="grid grid-cols-1 gap-4 md:grid-cols-3">
|
||||
<flux:select wire:model="portal" :label="__('Portal')">
|
||||
@foreach($portalOptions as $option)
|
||||
<option value="{{ $option->value }}">{{ $option->label() }}</option>
|
||||
@endforeach
|
||||
</flux:select>
|
||||
|
||||
<flux:select wire:model="language" :label="__('Sprache')">
|
||||
<option value="">{{ __('Alle') }}</option>
|
||||
<option value="de">{{ __('Deutsch') }}</option>
|
||||
<option value="en">{{ __('Englisch') }}</option>
|
||||
</flux:select>
|
||||
|
||||
<flux:input
|
||||
wire:model="priority"
|
||||
type="number"
|
||||
min="0"
|
||||
max="1000"
|
||||
:label="__('Priorität')"
|
||||
:description="__('Niedrigere Werte zuerst.')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Sichtbarkeit') }}</flux:heading>
|
||||
|
||||
<div class="mt-4 space-y-4">
|
||||
<flux:switch
|
||||
wire:model.live="isGlobal"
|
||||
:label="__('Global ausspielen')"
|
||||
:description="__('Wird unter allen Pressemitteilungen angezeigt – Kategorie-Zuordnung wird ignoriert.')"
|
||||
/>
|
||||
|
||||
<flux:switch
|
||||
wire:model="isActive"
|
||||
:label="__('Aktiv')"
|
||||
:description="__('Inaktive Codes werden niemals ausgespielt.')"
|
||||
/>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
@if(! $isGlobal)
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Kategorie-Zuordnung') }}</flux:heading>
|
||||
<flux:subheading>
|
||||
{{ __('Nur Pressemitteilungen in diesen Kategorien zeigen den Footer-Code.') }}
|
||||
</flux:subheading>
|
||||
|
||||
<div class="mt-4 grid grid-cols-1 gap-2 md:grid-cols-2 lg:grid-cols-3">
|
||||
@forelse($categoryOptions as $option)
|
||||
<label class="flex items-center gap-2 rounded border border-zinc-200 px-3 py-2 dark:border-zinc-700">
|
||||
<input
|
||||
type="checkbox"
|
||||
wire:model="categoryIds"
|
||||
value="{{ $option['id'] }}"
|
||||
class="rounded border-zinc-300"
|
||||
/>
|
||||
<span class="text-sm">{{ $option['name'] }}</span>
|
||||
</label>
|
||||
@empty
|
||||
<flux:text class="text-zinc-500">
|
||||
{{ __('Keine Kategorien vorhanden.') }}
|
||||
</flux:text>
|
||||
@endforelse
|
||||
</div>
|
||||
</flux:card>
|
||||
@endif
|
||||
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-end gap-2">
|
||||
<flux:button
|
||||
variant="ghost"
|
||||
:href="route('admin.footer-codes.index')"
|
||||
wire:navigate
|
||||
>
|
||||
{{ __('Abbrechen') }}
|
||||
</flux:button>
|
||||
<flux:button type="submit" variant="primary" icon="check">
|
||||
{{ __('Speichern') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
</form>
|
||||
</div>
|
||||
232
resources/views/livewire/admin/footer-codes/edit.blade.php
Normal file
232
resources/views/livewire/admin/footer-codes/edit.blade.php
Normal file
|
|
@ -0,0 +1,232 @@
|
|||
<?php
|
||||
|
||||
use App\Enums\Portal;
|
||||
use App\Models\Category;
|
||||
use App\Models\FooterCode;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Livewire\Attributes\Layout;
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Attributes\Validate;
|
||||
use Livewire\Volt\Component;
|
||||
|
||||
new #[Layout('components.layouts.app'), Title('Footer-Code bearbeiten')] class extends Component
|
||||
{
|
||||
public int $id = 0;
|
||||
|
||||
#[Validate('required|string|min:2|max:255')]
|
||||
public string $title = '';
|
||||
|
||||
#[Validate('required|string|min:5')]
|
||||
public string $content = '';
|
||||
|
||||
#[Validate('required|in:'.Portal::Both->value.','.Portal::Presseecho->value.','.Portal::Businessportal24->value)]
|
||||
public string $portal = Portal::Both->value;
|
||||
|
||||
#[Validate('nullable|in:de,en')]
|
||||
public ?string $language = null;
|
||||
|
||||
public bool $isGlobal = false;
|
||||
|
||||
public bool $isActive = true;
|
||||
|
||||
#[Validate('integer|min:0|max:1000')]
|
||||
public int $priority = 0;
|
||||
|
||||
/** @var array<int, int> */
|
||||
public array $categoryIds = [];
|
||||
|
||||
public function mount(int $id): void
|
||||
{
|
||||
$code = FooterCode::query()
|
||||
->with('categories:id')
|
||||
->findOrFail($id);
|
||||
|
||||
$this->id = $code->id;
|
||||
$this->title = $code->title;
|
||||
$this->content = $code->content;
|
||||
$this->portal = $code->portal->value;
|
||||
$this->language = $code->language;
|
||||
$this->isGlobal = $code->is_global;
|
||||
$this->isActive = $code->is_active;
|
||||
$this->priority = $code->priority;
|
||||
$this->categoryIds = $code->categories->pluck('id')->all();
|
||||
}
|
||||
|
||||
public function save(): void
|
||||
{
|
||||
$this->validate();
|
||||
|
||||
$code = FooterCode::query()->findOrFail($this->id);
|
||||
|
||||
DB::transaction(function () use ($code): void {
|
||||
$code->update([
|
||||
'title' => $this->title,
|
||||
'content' => $this->content,
|
||||
'portal' => $this->portal,
|
||||
'language' => $this->language,
|
||||
'is_global' => $this->isGlobal,
|
||||
'is_active' => $this->isActive,
|
||||
'priority' => $this->priority,
|
||||
]);
|
||||
|
||||
$code->categories()->sync(
|
||||
$this->isGlobal ? [] : $this->categoryIds,
|
||||
);
|
||||
});
|
||||
|
||||
session()->flash('success', __('Footer-Code wurde aktualisiert.'));
|
||||
|
||||
$this->redirect(route('admin.footer-codes.index'), navigate: true);
|
||||
}
|
||||
|
||||
public function delete(): void
|
||||
{
|
||||
$code = FooterCode::query()->findOrFail($this->id);
|
||||
$code->delete();
|
||||
|
||||
session()->flash('success', __('Footer-Code wurde gelöscht.'));
|
||||
|
||||
$this->redirect(route('admin.footer-codes.index'), navigate: true);
|
||||
}
|
||||
|
||||
public function with(): array
|
||||
{
|
||||
return [
|
||||
'portalOptions' => Portal::cases(),
|
||||
'categoryOptions' => Category::query()
|
||||
->with(['translations' => fn ($q) => $q->where('locale', 'de')])
|
||||
->orderBy('id')
|
||||
->get()
|
||||
->map(fn (Category $cat) => [
|
||||
'id' => $cat->id,
|
||||
'name' => $cat->translations->first()?->name ?? '#'.$cat->id,
|
||||
'portal' => $cat->portal->value,
|
||||
]),
|
||||
];
|
||||
}
|
||||
}; ?>
|
||||
|
||||
<div class="space-y-6">
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ __('Footer-Code bearbeiten') }}</flux:heading>
|
||||
<flux:subheading>#{{ $id }} – {{ $title }}</flux:subheading>
|
||||
</div>
|
||||
<flux:button
|
||||
variant="ghost"
|
||||
icon="arrow-left"
|
||||
:href="route('admin.footer-codes.index')"
|
||||
wire:navigate
|
||||
>
|
||||
{{ __('Zurück') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<form wire:submit="save" class="space-y-6">
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Stammdaten') }}</flux:heading>
|
||||
|
||||
<div class="mt-4 space-y-4">
|
||||
<flux:input wire:model="title" :label="__('Titel')" />
|
||||
|
||||
<flux:textarea
|
||||
wire:model="content"
|
||||
:label="__('HTML-/Text-Inhalt')"
|
||||
rows="10"
|
||||
/>
|
||||
|
||||
<div class="grid grid-cols-1 gap-4 md:grid-cols-3">
|
||||
<flux:select wire:model="portal" :label="__('Portal')">
|
||||
@foreach($portalOptions as $option)
|
||||
<option value="{{ $option->value }}">{{ $option->label() }}</option>
|
||||
@endforeach
|
||||
</flux:select>
|
||||
|
||||
<flux:select wire:model="language" :label="__('Sprache')">
|
||||
<option value="">{{ __('Alle') }}</option>
|
||||
<option value="de">{{ __('Deutsch') }}</option>
|
||||
<option value="en">{{ __('Englisch') }}</option>
|
||||
</flux:select>
|
||||
|
||||
<flux:input
|
||||
wire:model="priority"
|
||||
type="number"
|
||||
min="0"
|
||||
max="1000"
|
||||
:label="__('Priorität')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Sichtbarkeit') }}</flux:heading>
|
||||
|
||||
<div class="mt-4 space-y-4">
|
||||
<flux:switch
|
||||
wire:model.live="isGlobal"
|
||||
:label="__('Global ausspielen')"
|
||||
:description="__('Wird unter allen Pressemitteilungen angezeigt – Kategorie-Zuordnung wird ignoriert.')"
|
||||
/>
|
||||
|
||||
<flux:switch
|
||||
wire:model="isActive"
|
||||
:label="__('Aktiv')"
|
||||
/>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
@if(! $isGlobal)
|
||||
<flux:card>
|
||||
<flux:heading size="lg">{{ __('Kategorie-Zuordnung') }}</flux:heading>
|
||||
|
||||
<div class="mt-4 grid grid-cols-1 gap-2 md:grid-cols-2 lg:grid-cols-3">
|
||||
@forelse($categoryOptions as $option)
|
||||
<label class="flex items-center gap-2 rounded border border-zinc-200 px-3 py-2 dark:border-zinc-700">
|
||||
<input
|
||||
type="checkbox"
|
||||
wire:model="categoryIds"
|
||||
value="{{ $option['id'] }}"
|
||||
class="rounded border-zinc-300"
|
||||
/>
|
||||
<span class="text-sm">{{ $option['name'] }}</span>
|
||||
</label>
|
||||
@empty
|
||||
<flux:text class="text-zinc-500">
|
||||
{{ __('Keine Kategorien vorhanden.') }}
|
||||
</flux:text>
|
||||
@endforelse
|
||||
</div>
|
||||
</flux:card>
|
||||
@endif
|
||||
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-between gap-2">
|
||||
<flux:button
|
||||
type="button"
|
||||
variant="danger"
|
||||
icon="trash"
|
||||
wire:click="delete"
|
||||
wire:confirm="{{ __('Footer-Code wirklich löschen?') }}"
|
||||
>
|
||||
{{ __('Löschen') }}
|
||||
</flux:button>
|
||||
|
||||
<div class="flex items-center gap-2">
|
||||
<flux:button
|
||||
variant="ghost"
|
||||
:href="route('admin.footer-codes.index')"
|
||||
wire:navigate
|
||||
>
|
||||
{{ __('Abbrechen') }}
|
||||
</flux:button>
|
||||
<flux:button type="submit" variant="primary" icon="check">
|
||||
{{ __('Speichern') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</div>
|
||||
</flux:card>
|
||||
</form>
|
||||
</div>
|
||||
240
resources/views/livewire/admin/footer-codes/index.blade.php
Normal file
240
resources/views/livewire/admin/footer-codes/index.blade.php
Normal file
|
|
@ -0,0 +1,240 @@
|
|||
<?php
|
||||
|
||||
use App\Enums\Portal;
|
||||
use App\Models\FooterCode;
|
||||
use Livewire\Attributes\Layout;
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\Volt\Component;
|
||||
use Livewire\WithPagination;
|
||||
|
||||
new #[Layout('components.layouts.app'), Title('Footer-Codes')] class extends Component
|
||||
{
|
||||
use WithPagination;
|
||||
|
||||
public string $search = '';
|
||||
|
||||
public string $portalFilter = 'all';
|
||||
|
||||
public string $statusFilter = 'all';
|
||||
|
||||
public function updatedSearch(): void
|
||||
{
|
||||
$this->resetPage();
|
||||
}
|
||||
|
||||
public function updatedPortalFilter(): void
|
||||
{
|
||||
$this->resetPage();
|
||||
}
|
||||
|
||||
public function updatedStatusFilter(): void
|
||||
{
|
||||
$this->resetPage();
|
||||
}
|
||||
|
||||
public function toggleActive(int $id): void
|
||||
{
|
||||
$footerCode = FooterCode::query()->find($id);
|
||||
|
||||
if (! $footerCode) {
|
||||
return;
|
||||
}
|
||||
|
||||
$footerCode->update(['is_active' => ! $footerCode->is_active]);
|
||||
}
|
||||
|
||||
public function with(): array
|
||||
{
|
||||
$term = trim($this->search);
|
||||
|
||||
$codes = FooterCode::query()
|
||||
->withCount('categories')
|
||||
->when($this->portalFilter !== 'all', fn ($q) => $q->where('portal', $this->portalFilter))
|
||||
->when($this->statusFilter === 'active', fn ($q) => $q->where('is_active', true))
|
||||
->when($this->statusFilter === 'inactive', fn ($q) => $q->where('is_active', false))
|
||||
->when($this->statusFilter === 'global', fn ($q) => $q->where('is_global', true))
|
||||
->when(filled($term), function ($q) use ($term): void {
|
||||
$q->where(function ($q) use ($term): void {
|
||||
$q->where('title', 'like', '%'.$term.'%')
|
||||
->orWhere('content', 'like', '%'.$term.'%');
|
||||
});
|
||||
})
|
||||
->orderByDesc('is_global')
|
||||
->orderBy('priority')
|
||||
->orderBy('title')
|
||||
->paginate(25);
|
||||
|
||||
return [
|
||||
'codes' => $codes,
|
||||
'portalOptions' => Portal::cases(),
|
||||
'totals' => [
|
||||
'total' => FooterCode::query()->count(),
|
||||
'active' => FooterCode::query()->where('is_active', true)->count(),
|
||||
'global' => FooterCode::query()->where('is_global', true)->count(),
|
||||
],
|
||||
];
|
||||
}
|
||||
}; ?>
|
||||
|
||||
<div class="space-y-6">
|
||||
@if(session('success'))
|
||||
<flux:callout color="green" icon="check-circle">{{ session('success') }}</flux:callout>
|
||||
@endif
|
||||
@if(session('error'))
|
||||
<flux:callout color="red" icon="exclamation-triangle">{{ session('error') }}</flux:callout>
|
||||
@endif
|
||||
|
||||
<flux:card>
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<div>
|
||||
<flux:heading size="xl">{{ __('Footer-Codes') }}</flux:heading>
|
||||
<flux:subheading>
|
||||
{{ __('Snippets, die unter Pressemitteilungen ausgespielt werden.') }}
|
||||
</flux:subheading>
|
||||
</div>
|
||||
<flux:button
|
||||
variant="primary"
|
||||
icon="plus"
|
||||
:href="route('admin.footer-codes.create')"
|
||||
wire:navigate
|
||||
>
|
||||
{{ __('Footer-Code anlegen') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<div class="grid grid-cols-1 gap-4 sm:grid-cols-3">
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<flux:text class="text-sm text-zinc-500">{{ __('Gesamt') }}</flux:text>
|
||||
<flux:text size="xl" weight="bold">{{ $totals['total'] }}</flux:text>
|
||||
</div>
|
||||
<flux:icon.code-bracket-square class="size-8 text-blue-500" />
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<flux:text class="text-sm text-zinc-500">{{ __('Aktiv') }}</flux:text>
|
||||
<flux:text size="xl" weight="bold">{{ $totals['active'] }}</flux:text>
|
||||
</div>
|
||||
<flux:icon.bolt class="size-8 text-green-500" />
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card>
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<flux:text class="text-sm text-zinc-500">{{ __('Global') }}</flux:text>
|
||||
<flux:text size="xl" weight="bold">{{ $totals['global'] }}</flux:text>
|
||||
</div>
|
||||
<flux:icon.globe-alt class="size-8 text-purple-500" />
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
|
||||
<flux:card>
|
||||
<div class="grid gap-3 md:grid-cols-[1fr,auto,auto]">
|
||||
<flux:input
|
||||
wire:model.live.debounce.300ms="search"
|
||||
placeholder="{{ __('Titel oder Inhalt suchen…') }}"
|
||||
icon="magnifying-glass"
|
||||
/>
|
||||
|
||||
<flux:select wire:model.live="portalFilter">
|
||||
<option value="all">{{ __('Alle Portale') }}</option>
|
||||
@foreach($portalOptions as $option)
|
||||
<option value="{{ $option->value }}">{{ $option->label() }}</option>
|
||||
@endforeach
|
||||
</flux:select>
|
||||
|
||||
<flux:select wire:model.live="statusFilter">
|
||||
<option value="all">{{ __('Alle Status') }}</option>
|
||||
<option value="active">{{ __('Aktiv') }}</option>
|
||||
<option value="inactive">{{ __('Inaktiv') }}</option>
|
||||
<option value="global">{{ __('Global') }}</option>
|
||||
</flux:select>
|
||||
</div>
|
||||
</flux:card>
|
||||
|
||||
<flux:card>
|
||||
<flux:table>
|
||||
<flux:table.columns>
|
||||
<flux:table.column>{{ __('Titel') }}</flux:table.column>
|
||||
<flux:table.column>{{ __('Portal') }}</flux:table.column>
|
||||
<flux:table.column>{{ __('Sprache') }}</flux:table.column>
|
||||
<flux:table.column>{{ __('Kategorien') }}</flux:table.column>
|
||||
<flux:table.column>{{ __('Priorität') }}</flux:table.column>
|
||||
<flux:table.column>{{ __('Status') }}</flux:table.column>
|
||||
<flux:table.column align="end">{{ __('Aktionen') }}</flux:table.column>
|
||||
</flux:table.columns>
|
||||
|
||||
<flux:table.rows>
|
||||
@forelse($codes as $code)
|
||||
<flux:table.row :key="'fc-'.$code->id">
|
||||
<flux:table.cell>
|
||||
<div class="flex items-center gap-2">
|
||||
@if($code->is_global)
|
||||
<flux:badge color="purple" size="xs" icon="globe-alt">{{ __('Global') }}</flux:badge>
|
||||
@endif
|
||||
<span class="font-medium">{{ $code->title }}</span>
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<flux:badge color="zinc" size="sm">{{ $code->portal->label() }}</flux:badge>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
{{ $code->language ? strtoupper($code->language) : '–' }}
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
@if($code->is_global)
|
||||
<span class="text-zinc-500">{{ __('alle') }}</span>
|
||||
@else
|
||||
{{ $code->categories_count }}
|
||||
@endif
|
||||
</flux:table.cell>
|
||||
<flux:table.cell>{{ $code->priority }}</flux:table.cell>
|
||||
<flux:table.cell>
|
||||
<flux:badge :color="$code->is_active ? 'green' : 'zinc'" size="sm">
|
||||
{{ $code->is_active ? __('Aktiv') : __('Inaktiv') }}
|
||||
</flux:badge>
|
||||
</flux:table.cell>
|
||||
<flux:table.cell align="end">
|
||||
<div class="flex items-center justify-end gap-1">
|
||||
<flux:button
|
||||
size="xs"
|
||||
variant="ghost"
|
||||
:icon="$code->is_active ? 'pause' : 'play'"
|
||||
wire:click="toggleActive({{ $code->id }})"
|
||||
:title="$code->is_active ? __('Deaktivieren') : __('Aktivieren')"
|
||||
/>
|
||||
<flux:button
|
||||
size="xs"
|
||||
variant="ghost"
|
||||
icon="pencil"
|
||||
:href="route('admin.footer-codes.edit', $code->id)"
|
||||
wire:navigate
|
||||
:title="__('Bearbeiten')"
|
||||
/>
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
</flux:table.row>
|
||||
@empty
|
||||
<flux:table.row>
|
||||
<flux:table.cell :colspan="7">
|
||||
<div class="py-8 text-center text-zinc-500">
|
||||
{{ __('Keine Footer-Codes gefunden.') }}
|
||||
</div>
|
||||
</flux:table.cell>
|
||||
</flux:table.row>
|
||||
@endforelse
|
||||
</flux:table.rows>
|
||||
</flux:table>
|
||||
|
||||
<div class="mt-4">
|
||||
{{ $codes->links() }}
|
||||
</div>
|
||||
</flux:card>
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue