65 lines
2.3 KiB
PHP
65 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Filament\Infolists\Components;
|
|
|
|
use Filament\Infolists\Components\Entry;
|
|
use Filament\Support\Components\Contracts\HasEmbeddedView;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class PhotoGalleryEntry extends Entry implements HasEmbeddedView
|
|
{
|
|
public function toEmbeddedHtml(): string
|
|
{
|
|
$images = $this->getState() ?? [];
|
|
$images = is_array($images) ? array_values(array_filter($images)) : [];
|
|
$urls = array_values(array_map(
|
|
fn ($path) => Storage::disk('public')->url($path),
|
|
$images
|
|
));
|
|
|
|
if (empty($urls)) {
|
|
$html = '<span class="text-sm text-gray-400">-</span>';
|
|
|
|
return $this->wrapEmbeddedHtml($html);
|
|
}
|
|
|
|
$record = $this->getRecord();
|
|
$caption = match ($this->getName()) {
|
|
'photos_before' => $record?->surgery_before,
|
|
'photos_after' => $record?->sergery_after,
|
|
default => null,
|
|
};
|
|
$section = match ($this->getName()) {
|
|
'photos_before' => 'before',
|
|
'photos_after' => 'after',
|
|
default => '',
|
|
};
|
|
$captionAttr = $caption ? ' data-lb-caption="' . htmlspecialchars($caption, ENT_QUOTES, 'UTF-8') . '"' : '';
|
|
$sectionAttr = $section ? ' data-lb-section="' . $section . '"' : '';
|
|
|
|
$group = 'gallery-' . md5(implode(',', $urls));
|
|
$items = '';
|
|
|
|
foreach ($urls as $idx => $url) {
|
|
$esc = e($url);
|
|
$items .= <<<HTML
|
|
<div
|
|
class="relative cursor-pointer rounded-lg overflow-hidden border border-gray-200 hover:border-primary-400 hover:opacity-80 transition-all shadow-sm group"
|
|
style="aspect-ratio:16/9;"
|
|
data-lb-group="{$group}"
|
|
data-lb-idx="{$idx}"
|
|
data-lb-src="{$esc}"{$captionAttr}{$sectionAttr}
|
|
>
|
|
<img src="{$esc}" class="w-full h-full object-cover" alt="" loading="lazy" />
|
|
<div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition duration-200"></div>
|
|
</div>
|
|
HTML;
|
|
}
|
|
|
|
$html = '<div class="grid grid-cols-4 gap-2">' . $items . '</div>';
|
|
|
|
return $this->wrapEmbeddedHtml($html);
|
|
}
|
|
} |