@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
cd-project/img/...) o URL externa. También podés subir una imagen nueva al CDN del tenant con el botón .