@props(['field', 'name', 'value' => '']) @php $required = $field['required'] ?? false; $hasValue = !empty($value); $isUrl = $hasValue && (str_starts_with($value, 'http://') || str_starts_with($value, 'https://')); // Resolver previewUrl: // 1. URL absoluta (http/https) → usar tal cual // 2. Path que empieza con 'storage/' → asset() directo (ya tiene prefix) // 3. Path que empieza con 'cd-project/' o cualquier path bajo public/ → asset() directo // 4. Otro path relativo (legacy/upload) → asumir bajo storage/ (asset('storage/...')) if (!$hasValue) { $previewUrl = null; } elseif ($isUrl) { $previewUrl = $value; } elseif (str_starts_with($value, 'storage/') || str_starts_with($value, 'cd-project/')) { $previewUrl = asset(ltrim($value, '/')); } else { $previewUrl = asset('storage/' . ltrim($value, '/')); } // Subfolder Cloudinary inferido del key (welcome.story_image_1 → "welcome", about.image_carousel_1 → "about", etc.) $cloudinarySubfolder = (string) Illuminate\Support\Str::of($field['key']) ->before('.')->before('_')->slug('-')->lower(); if (empty($cloudinarySubfolder) || $cloudinarySubfolder === 'site') { $cloudinarySubfolder = 'site-data'; } $uniqueId = 'fld_' . $field['key']; @endphp
{{-- Botón "Subir imagen" que dispara el file input oculto --}}
{{-- File input hidden + estado de subida --}}
{{-- Preview de la imagen actual --}}
@if($previewUrl) preview @endif
Path relativo (cd-project/img/...) o URL externa. También podés subir una imagen nueva al CDN del tenant con el botón .
@once {{-- Script global para todos los image fields (solo se imprime 1 vez aunque haya N campos en la página) --}} @push('scripts') @endpush @endonce