'', 'filterType' => 'all', 'filterCollection' => '', 'viewMode' => 'grid', 'editingId' => null, 'editLocale' => 'de', 'altText' => '', 'mediaTitle' => '', 'collection' => '', 'showDetail' => false, 'selectedProfiles' => [], ]); $media = computed( fn () => CmsMedia::query() ->when( $this->filterType !== 'all', fn ($q) => match ($this->filterType) { 'image' => $q->images(), 'pdf' => $q->pdfs(), 'document' => $q->documents(), default => $q, }, ) ->when($this->filterCollection, fn ($q) => $q->inCollection($this->filterCollection)) ->when($this->search, fn ($q) => $q->where('filename', 'like', "%{$this->search}%")) ->orderByDesc('created_at') ->paginate(48), ); $collections = computed(fn () => CmsMedia::query()->whereNotNull('collection')->where('collection', '!=', '')->distinct()->pluck('collection')->sort()->values()->toArray()); $profiles = computed(fn () => config('flux-cms.media.profiles', [])); $stats = computed( fn () => [ 'total' => CmsMedia::count(), 'images' => CmsMedia::images()->count(), 'pdfs' => CmsMedia::pdfs()->count(), ], ); on([ 'media-library-uploaded' => function ($mediaId) { $media = CmsMedia::find($mediaId); if ($media) { Flux::toast(variant: 'success', heading: 'Hochgeladen', text: $media->filename . ' wurde erfolgreich hochgeladen.'); } }, ]); $startEdit = function (int $id) { $media = CmsMedia::find($id); if (! $media) { return; } $this->editingId = $id; $this->altText = $media->getTranslation('alt_text', $this->editLocale) ?? ''; $this->mediaTitle = $media->getTranslation('title', $this->editLocale) ?? ''; $this->collection = $media->collection ?? ''; $this->showDetail = true; }; $switchLocale = function (string $locale) { $this->editLocale = $locale; if ($this->editingId) { $media = CmsMedia::find($this->editingId); if ($media) { $this->altText = $media->getTranslation('alt_text', $locale) ?? ''; $this->mediaTitle = $media->getTranslation('title', $locale) ?? ''; } } }; $saveEdit = function () { $media = CmsMedia::find($this->editingId); if (! $media) { return; } $media->setTranslation('alt_text', $this->editLocale, $this->altText); $media->setTranslation('title', $this->editLocale, $this->mediaTitle); $media->collection = $this->collection; $media->save(); Flux::toast(variant: 'success', heading: 'Gespeichert', text: 'Medien-Details wurden aktualisiert.'); }; $generateConversion = function (string $profile) { $media = CmsMedia::find($this->editingId); if (! $media || ! $media->isImage()) { return; } $service = app(MediaConversionService::class); $result = $service->convert($media, $profile); if ($result) { $media->refresh(); Flux::toast(variant: 'success', heading: 'Conversion erstellt', text: "Profil \"{$profile}\" wurde generiert."); } else { Flux::toast(variant: 'danger', heading: 'Fehler', text: "Conversion \"{$profile}\" konnte nicht erstellt werden."); } }; $generateAllConversions = function () { $media = CmsMedia::find($this->editingId); if (! $media || ! $media->isImage()) { return; } $service = app(MediaConversionService::class); $results = $service->generateAllConversions($media); $count = count(array_filter($results)); $media->refresh(); Flux::toast(variant: 'success', heading: 'Alle Conversions erstellt', text: "{$count} Profile wurden generiert."); }; $deleteMedia = function (int $id) { $media = CmsMedia::find($id); if (! $media) { return; } $filename = $media->filename; $service = app(MediaConversionService::class); $service->deleteAll($media); $media->delete(); $this->editingId = null; $this->showDetail = false; Flux::toast(variant: 'success', heading: 'Gelöscht', text: "{$filename} wurde entfernt."); }; $closeDetail = function () { $this->showDetail = false; $this->editingId = null; }; ?>
Medienbibliothek
{{ $this->stats['images'] }} Bilder {{ $this->stats['pdfs'] }} PDFs
Alle Typen Bilder PDFs Dokumente @if (! empty($this->collections)) Alle Ordner @foreach ($this->collections as $col) {{ $col }} @endforeach @endif
@if ($viewMode === 'grid')
@forelse ($this->media as $item)
@if ($item->isImage()) {{ $item->getTranslation('alt_text', $editLocale) ?? $item->filename }} @elseif ($item->isPdf())
@else
{{ strtoupper(pathinfo($item->filename, PATHINFO_EXTENSION)) }}
@endif
@if ($item->isImage()) @elseif ($item->isPdf()) @else @endif

{{ $item->filename }}

{{ $item->getHumanFileSize() }}

@if ($item->collection)
{{ $item->collection }}
@endif
@empty
Noch keine Medien hochgeladen.
@endforelse
@else
@forelse ($this->media as $item) @empty @endforelse
Dateiname Datum
@if ($item->isImage()) @elseif ($item->isPdf())
@else
@endif
{{ $item->filename }} {{ $item->created_at->format('d.m.Y') }}
Noch keine Medien hochgeladen.
@endif @if ($this->media->hasPages())
{{ $this->media->links() }}
@endif
@if ($showDetail && $editingId) @php $editMedia = \FluxCms\Core\Models\CmsMedia::find($editingId); @endphp @if ($editMedia)
Details
@if ($editMedia->isImage()) {{ $editMedia->filename }} @elseif ($editMedia->isPdf()) @endif

Datei: {{ $editMedia->filename }}

Typ: {{ $editMedia->mime_type }}

Größe: {{ $editMedia->getHumanFileSize() }}

@if ($editMedia->getDimensionsLabel())

Abmessungen: {{ $editMedia->getDimensionsLabel() }} px

@endif

Hochgeladen: {{ $editMedia->created_at->format('d.m.Y H:i') }}

URL: {{ $editMedia->getUrl() }}

@foreach (config('flux-cms.locales', ['de' => 'DE', 'en' => 'EN']) as $code => $label) {{ strtoupper($code) }} @endforeach
Speichern
@if ($editMedia->isImage() && $editMedia->mime_type !== 'image/svg+xml')
Bildgrößen Alle generieren
@foreach ($this->profiles as $profileName => $profileConfig) @php $hasConversion = $editMedia->hasConversion($profileName); $conversionUrl = $hasConversion ? $editMedia->getConversionUrl($profileName) : null; @endphp
{{ $profileName }} {{ $profileConfig['width'] }}×{{ $profileConfig['height'] }} {{ strtoupper($profileConfig['format'] ?? 'webp') }}
@if ($hasConversion) OK @else @endif
@endforeach
@endif
Datei löschen
@endif @endif