125 lines
3.3 KiB
PHP
125 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Admin\Cms;
|
|
|
|
use App\Models\DisplayMedia;
|
|
use App\Services\DisplayMediaService;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Contracts\View\View;
|
|
use Livewire\Component;
|
|
use Livewire\WithFileUploads;
|
|
use Livewire\WithPagination;
|
|
|
|
class DisplayMediaPicker extends Component
|
|
{
|
|
use WithFileUploads;
|
|
use WithPagination;
|
|
|
|
public ?int $value = null;
|
|
|
|
public string $field = 'media_url';
|
|
|
|
public string $type = 'all';
|
|
|
|
public string $label = 'Medium auswählen';
|
|
|
|
public bool $showModal = false;
|
|
|
|
public string $search = '';
|
|
|
|
/** @var array<\Livewire\Features\SupportFileUploads\TemporaryUploadedFile> */
|
|
public array $quickUploads = [];
|
|
|
|
public function mount(?int $value = null): void
|
|
{
|
|
$this->value = $value;
|
|
}
|
|
|
|
public function openPicker(): void
|
|
{
|
|
$this->showModal = true;
|
|
}
|
|
|
|
public function selectMedia(int $id): void
|
|
{
|
|
$media = DisplayMedia::find($id);
|
|
if (! $media) {
|
|
return;
|
|
}
|
|
|
|
$this->value = $media->id;
|
|
$this->showModal = false;
|
|
|
|
$this->dispatch('display-media-selected', field: $this->field, mediaId: $media->id, url: $media->getUrl());
|
|
}
|
|
|
|
public function clearSelection(): void
|
|
{
|
|
$this->value = null;
|
|
$this->dispatch('display-media-selected', field: $this->field, mediaId: null, url: null);
|
|
}
|
|
|
|
public function updatedQuickUploads(): void
|
|
{
|
|
$this->validate([
|
|
'quickUploads' => 'nullable|array|max:5',
|
|
'quickUploads.*' => 'file|mimes:jpeg,jpg,png,gif,webp,mp4,webm,mov|max:51200',
|
|
]);
|
|
|
|
$service = app(DisplayMediaService::class);
|
|
$lastMedia = null;
|
|
|
|
foreach ($this->quickUploads as $file) {
|
|
$lastMedia = $service->storeUpload($file);
|
|
}
|
|
|
|
$this->quickUploads = [];
|
|
|
|
if ($lastMedia) {
|
|
$this->value = $lastMedia->id;
|
|
$this->showModal = false;
|
|
|
|
$this->dispatch('display-media-selected', field: $this->field, mediaId: $lastMedia->id, url: $lastMedia->getUrl());
|
|
}
|
|
}
|
|
|
|
public function removeQuickUpload(int $index): void
|
|
{
|
|
if (isset($this->quickUploads[$index])) {
|
|
unset($this->quickUploads[$index]);
|
|
$this->quickUploads = array_values($this->quickUploads);
|
|
}
|
|
}
|
|
|
|
public function render(): View
|
|
{
|
|
return view('livewire.admin.cms.display-media-picker', [
|
|
'selectedMedia' => $this->resolveSelectedMedia(),
|
|
'mediaItems' => $this->resolveMediaItems(),
|
|
]);
|
|
}
|
|
|
|
private function resolveSelectedMedia(): ?DisplayMedia
|
|
{
|
|
if (! $this->value) {
|
|
return null;
|
|
}
|
|
|
|
return DisplayMedia::find($this->value);
|
|
}
|
|
|
|
/**
|
|
* @return LengthAwarePaginator<int, DisplayMedia>
|
|
*/
|
|
private function resolveMediaItems(): LengthAwarePaginator
|
|
{
|
|
return DisplayMedia::query()
|
|
->active()
|
|
->when($this->type === 'image', fn ($q) => $q->images())
|
|
->when($this->type === 'video', fn ($q) => $q->videos())
|
|
->when($this->search, fn ($q) => $q->where('filename', 'like', "%{$this->search}%")
|
|
->orWhere('title', 'like', "%{$this->search}%"))
|
|
->orderByDesc('created_at')
|
|
->paginate(18);
|
|
}
|
|
}
|