@php use App\Enums\MediaType; $existingImages = collect($existingImages ?? []); $existingMedia = collect($existingMedia ?? []); $maxItems = (int) config('admin.media.max_gallery_items', 10); $maxImage = (int) config('admin.media.max_image_size', 2048); $maxVideo = (int) config('admin.media.max_video_size', 25600); $maxImageMb = max(1, (int) round($maxImage / 1024)); $maxVideoMb = max(1, (int) round($maxVideo / 1024)); $canUpload = (bool) auth()->user()?->can(\App\Models\Permission::MEDIA_UPLOAD); $canDelete = (bool) auth()->user()?->can(\App\Models\Permission::MEDIA_DELETE); $existingPayload = []; foreach ($existingImages as $image) { $item = [ 'id' => $image->id, 'url' => '/storage/'.ltrim((string) $image->path, '/'), 'type' => 'image', 'kind' => 'legacy_image', ]; if ($canDelete && ! empty($deleteRouteName)) { $item['deleteUrl'] = route($deleteRouteName, array_merge($deleteRouteParams ?? [], ['image' => $image->id])); } $existingPayload[] = $item; } foreach ($existingMedia as $media) { $type = MediaType::fromMime($media->mime_type)?->value ?? 'image'; $item = [ 'id' => $media->id, 'url' => '/storage/'.ltrim((string) $media->path, '/'), 'type' => $type, 'kind' => 'media', ]; if ($canDelete && ! empty($deleteMediaRouteName)) { $item['deleteUrl'] = route($deleteMediaRouteName, array_merge($deleteMediaRouteParams ?? [], ['media' => $media->id])); } $existingPayload[] = $item; } $accept = implode(',', array_merge( MediaType::allowedImageMimeTypes(), MediaType::allowedVideoMimeTypes(), )); @endphp

{{ __('admin.gallery_media_hint') }} — {{ __('admin.gallery_drop_hint') }} — {{ __('admin.gallery_size_hint', ['image' => $maxImageMb, 'video' => $maxVideoMb, 'max' => $maxItems]) }}

{{-- SSR so gallery is visible even before/without JS --}} @foreach ($existingPayload as $item)
@if (($item['type'] ?? '') === 'video') @else @endif @if ($canDelete && ! empty($item['deleteUrl'])) @endif
@endforeach
@if ($canUpload)

{{ __('admin.gallery_drop_title') }}

{{ __('admin.gallery_drop_hint') }}

{{ count($existingPayload) }} / {{ $maxItems }}

{{-- Keep outside any nested semantics; JS syncs selected FileList here --}}

@endif