This commit is contained in:
2025-12-09 00:54:13 +05:00
parent 88fdc3aa7f
commit 967501d58f
5 changed files with 265 additions and 18 deletions

View File

@@ -147,10 +147,15 @@ class VisaMasterPaymentOrderForm
->columnSpanFull()
->columns(2)
->schema([
SpatieMediaLibraryFileUpload::make('sender_passport_local')
AdvancedFileUpload::make('sender_passport_local')
->collection('sender_passport_local')
->label(__('Ugradyja degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi'))
->required(),
->spatieMediaLibrary()
->multiple(),
// SpatieMediaLibraryFileUpload::make('sender_passport_local')
// ->collection('sender_passport_local')
// ->label(__('Ugradyja degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi'))
// ->required(),
SpatieMediaLibraryFileUpload::make('sender_passport_international')
->collection('sender_passport_international')

View File

@@ -7,7 +7,7 @@ use App\Modules\Region\Repositories\RegionRepository;
use App\Modules\TurkmenPassport\Repositories\TurkmenPassportRepository;
use App\Modules\VisaMasterPaymentOrder\Models\VisaMasterPaymentOrder;
use Filament\Infolists\Components\IconEntry;
use Filament\Infolists\Components\SpatieMediaLibraryImageEntry;
use App\Filament\Infolists\Components\SpatieMediaLibraryFileEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Fieldset;
use Filament\Schemas\Components\Section;
@@ -114,27 +114,27 @@ class VisaMasterPaymentOrderInfolist
->columnSpanFull()
->columns(2)
->schema([
SpatieMediaLibraryImageEntry::make('sender_passport_local')
SpatieMediaLibraryFileEntry::make('sender_passport_local')
->collection('sender_passport_local')
->label(__('Ugradyja degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi')),
SpatieMediaLibraryImageEntry::make('sender_passport_international')
SpatieMediaLibraryFileEntry::make('sender_passport_international')
->collection('sender_passport_international')
->label(__('Ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportynyň asyl görnüşi we göçürmesi')),
SpatieMediaLibraryImageEntry::make('sender_travel_stamp_on_passport')
SpatieMediaLibraryFileEntry::make('sender_travel_stamp_on_passport')
->collection('sender_travel_stamp_on_passport')
->label(__('Ugradyja degişli Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky daşary döwletine gidendigi we daşary döwlete barandygy baradaky (ştampyň) bellenen sahypasynyň göçürmesi')),
SpatieMediaLibraryImageEntry::make('sender_proof_of_kinship')
SpatieMediaLibraryFileEntry::make('sender_proof_of_kinship')
->collection('sender_proof_of_kinship')
->label(__('Ugradyjynyň we kabul edijiniň (talybyň) özara garyndaşlyk derejesini tassyklaýjy resminamalarynyň göçürmesi')),
SpatieMediaLibraryImageEntry::make('sender_passport_local_old')
SpatieMediaLibraryFileEntry::make('sender_passport_local_old')
->collection('sender_passport_local_old')
->label(__('Ugradyjy we kabul ediji (talyp) 2015-nji ýyldan soňra Türkmenistanyň raýatynyň pasportyny ikinji gezek alan bolsa, onda birinji gezek alan pasportynyň seriýasy baradaky maglumat')),
SpatieMediaLibraryImageEntry::make('sender_passport_local_old_replacement')
SpatieMediaLibraryFileEntry::make('sender_passport_local_old_replacement')
->collection('sender_passport_local_old_replacement')
->label(__('Ugradyjy we kabul ediji (talyp) 2015-nji ýyldan soňra Türkmenistanyň raýatynyň pasportyny ikinji gezek alandan soňra birinji gezek alan pasportynyň seriýasy baradaky maglumaty bilmeýän ,bolsa onda polisiýanyň degişli edaralaryndan birinji alan pasportynyň seriýasy baradaky güwänamasy')),
]),
@@ -163,42 +163,42 @@ class VisaMasterPaymentOrderInfolist
->columnSpanFull()
->columns(2)
->schema([
SpatieMediaLibraryImageEntry::make('receiver_requisite')
SpatieMediaLibraryFileEntry::make('receiver_requisite')
->collection('receiver_requisite')
->label(__('Talyba degişli walýuta "VISA" kartyň rekwizitleri'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_document_stating_he_is_studying')
SpatieMediaLibraryFileEntry::make('receiver_document_stating_he_is_studying')
->collection('receiver_document_stating_he_is_studying')
->label(__('Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasy'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_ticket')
SpatieMediaLibraryFileEntry::make('receiver_ticket')
->collection('receiver_ticket')
->label(__('Talybyň bilediniň göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_passport_local')
SpatieMediaLibraryFileEntry::make('receiver_passport_local')
->collection('receiver_passport_local')
->label(__('Talyba degişli Türkmenistanyň raýatynyň (içki milli) pasportynyň asyl görnüşi we göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_passport_international')
SpatieMediaLibraryFileEntry::make('receiver_passport_international')
->collection('receiver_passport_international')
->label(__('Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin (zagran) pasportynyň göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_visa')
SpatieMediaLibraryFileEntry::make('receiver_visa')
->collection('receiver_visa')
->label(__('Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky daşary ýurtda galyp okap bilýändigi baradaky berlen möhleti hereket edýän rugsatnamasynyň (wizasynyň) bellenen sahypasynyň göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_travel_stamp_on_passport')
SpatieMediaLibraryFileEntry::make('receiver_travel_stamp_on_passport')
->collection('receiver_travel_stamp_on_passport')
->label(__('Talybyň Türkmenistandan çykmak we Türkmenistana girmek üçin pasportyndaky Türkmenistandan çykandygy we daşary ýurt döwletine girendigi baradaky ştamplaryň (seneli ştampyň) bellenen sahypasynyň göçürmesi'))
->columnSpan(1),
SpatieMediaLibraryImageEntry::make('receiver_document_stating_he_is_studying_2')
SpatieMediaLibraryFileEntry::make('receiver_document_stating_he_is_studying_2')
->collection('receiver_document_stating_he_is_studying_2')
->label(__('Talybyň daşary ýurt döwletiniň ýokary okuw mekdebinde okaýandygy baradaky güwänamasyndaky maglumatyň doly takyk däl ýagdaýynda takyk däl maglumatyň sebäpleri baradaky daşary ýurt döwletiniň ýokary okuw mekdebinden haty'))
->columnSpan(1),

View File

@@ -0,0 +1,149 @@
<?php
namespace App\Filament\Infolists\Components;
use Closure;
use Filament\Infolists\Components\Entry;
use Filament\Support\Concerns\HasMediaFilter;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
use Throwable;
class SpatieMediaLibraryFileEntry extends Entry
{
use HasMediaFilter;
protected string $view = 'filament.infolists.components.spatie-media-library-file-entry';
protected string | Closure | null $collection = null;
protected string | Closure | null $conversion = null;
protected string | Closure $visibility = 'private';
protected bool | Closure $isDownloadable = true;
protected bool | Closure $isPreviewable = true;
public function collection(string | Closure | null $collection): static
{
$this->collection = $collection;
return $this;
}
public function conversion(string | Closure | null $conversion): static
{
$this->conversion = $conversion;
return $this;
}
public function visibility(string | Closure $visibility): static
{
$this->visibility = $visibility;
return $this;
}
public function downloadable(bool | Closure $condition = true): static
{
$this->isDownloadable = $condition;
return $this;
}
public function previewable(bool | Closure $condition = true): static
{
$this->isPreviewable = $condition;
return $this;
}
public function getCollection(): ?string
{
return $this->evaluate($this->collection);
}
public function getConversion(): ?string
{
return $this->evaluate($this->conversion);
}
public function getVisibility(): string
{
return $this->evaluate($this->visibility);
}
public function isDownloadable(): bool
{
return (bool) $this->evaluate($this->isDownloadable);
}
public function isPreviewable(): bool
{
return (bool) $this->evaluate($this->isPreviewable);
}
public function getMediaUrl(Media $media, ?string $conversion = null): string
{
if ($this->getVisibility() === 'private') {
try {
return $media->getTemporaryUrl(
now()->addMinutes(30)->endOfHour(),
$conversion ?? '',
);
} catch (Throwable $exception) {
// This driver does not support creating temporary URLs.
}
}
return $media->getUrl($conversion ?? '');
}
public function getMedia(): Collection
{
$record = $this->getRecord();
if (! $record) {
return collect([]);
}
if ($this->hasStateRelationship($record)) {
$record = $this->getStateRelationshipResults($record);
}
$records = Arr::wrap($record);
$allMedia = collect([]);
$collection = $this->getCollection() ?? 'default';
foreach ($records as $record) {
/** @var Model $record */
$media = $record->getRelationValue('media');
if (! $media) {
continue;
}
$filteredMedia = $media
->when(
is_string($collection),
fn (MediaCollection $mediaCollection) => $mediaCollection->filter(fn (Media $media): bool => $media->getAttributeValue('collection_name') === $collection),
)
->when(
$this->hasMediaFilter(),
fn (Collection $media) => $this->filterMedia($media)
)
->sortBy('order_column');
$allMedia = $allMedia->merge($filteredMedia);
}
return $allMedia;
}
}

View File

@@ -22,6 +22,7 @@ use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
use Joaopaulolndev\FilamentEditProfile\FilamentEditProfilePlugin;
use RalphJSmit\Filament\Upload\FilamentUpload;
class WorkPanelProvider extends PanelProvider
{
@@ -71,6 +72,8 @@ class WorkPanelProvider extends PanelProvider
->customProfileComponents([
UserProfileFields::class,
]),
FilamentUpload::make(),
])
->authMiddleware([
Authenticate::class,

View File

@@ -0,0 +1,90 @@
<x-filament-infolists::entry-wrapper :entry="$entry">
@php
$media = $getMedia();
$hasImagesOnly = $media->every(fn($m) => str_starts_with($m->mime_type, 'image/'));
@endphp
@if ($media->isEmpty())
<div class="flex items-center justify-center rounded-xl border border-dashed border-gray-200 bg-white/50 p-4 text-sm text-gray-500 dark:border-white/10 dark:bg-white/5 dark:text-gray-400">
{{ __('No files uploaded') }}
</div>
@elseif ($hasImagesOnly)
<div
@class([
'grid gap-4',
'grid-cols-[repeat(auto-fill,minmax(120px,1fr))]' => $media->count() > 1,
])
>
@foreach ($media as $medium)
<div class="relative group">
<img
src="{{ $entry->getMediaUrl($medium, $media->count() > 1 ? 'thumb' : null) }}"
class="w-full rounded-lg"
/>
<a
href="{{ $entry->getMediaUrl($medium) }}"
target="_blank"
rel="noopener noreferrer"
class="absolute inset-0 flex items-center justify-center bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity rounded-lg"
>
<x-filament::icon
icon="heroicon-m-eye"
class="h-8 w-8 text-white"
/>
</a>
</div>
@endforeach
</div>
@else
<div class="flex flex-col gap-3">
@foreach ($getMedia() as $media)
<div class="flex items-center gap-3 rounded-xl border border-gray-200 bg-white p-2 shadow-sm dark:border-white/10 dark:bg-white/5">
<div class="flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-gray-100 dark:bg-white/10 overflow-hidden">
@if (str_starts_with($media->mime_type, 'image/'))
<img
src="{{ $media->hasGeneratedConversion('thumb') ? $entry->getMediaUrl($media, 'thumb') : $entry->getMediaUrl($media) }}"
alt="{{ $media->name }}"
class="h-full w-full object-cover"
/>
@else
<div class="flex h-full w-full items-center justify-center bg-white dark:bg-gray-800">
<x-filament::icon
icon="heroicon-o-document"
class="h-6 w-6 text-gray-500 dark:text-gray-400"
/>
</div>
@endif
</div>
<div class="flex-grow overflow-hidden">
<p class="truncate text-sm font-medium text-gray-950 dark:text-white" title="{{ $media->name }}">
{{ $media->name }}
</p>
<p class="text-xs text-gray-500 dark:text-gray-400">
{{ $media->human_readable_size }}
<span class="text-gray-300 dark:text-gray-600 px-1"></span>
<span class="uppercase">{{ $media->extension }}</span>
</p>
</div>
<div class="flex shrink-0 items-center gap-2 pr-2">
@if ($isPreviewable())
<a
href="{{ $entry->getMediaUrl($media) }}"
target="_blank"
rel="noopener noreferrer"
class="flex items-center justify-center h-8 w-8 rounded-full hover:bg-gray-50 dark:hover:bg-white/10 text-gray-500 hover:text-primary-600 dark:text-gray-400 dark:hover:text-primary-500 transition-colors"
title="{{ __('View') }}"
>
<x-filament::icon
icon="heroicon-m-eye"
class="h-5 w-5"
/>
</a>
@endif
</div>
</div>
@endforeach
</div>
@endif
</x-filament-infolists::entry-wrapper>