feat: patient view, media player, and rich editor enhancements
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user