From c667e86830a2ae7806cb8a87de3d3a2ccfffcd6f Mon Sep 17 00:00:00 2001 From: thapacodes4u Date: Sun, 19 Oct 2025 05:10:24 +0545 Subject: [PATCH 1/2] feat: replace ImageManager with MediaGallery component for enhanced image handling --- src/Filament/Resources/ProductResource.php | 8 ++- .../ProductResource/Pages/CreateProduct.php | 65 +++++++++++++++++-- .../ProductResource/Pages/EditProduct.php | 6 -- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/src/Filament/Resources/ProductResource.php b/src/Filament/Resources/ProductResource.php index 80caef9..8e00d59 100644 --- a/src/Filament/Resources/ProductResource.php +++ b/src/Filament/Resources/ProductResource.php @@ -4,7 +4,6 @@ use Eclipse\Catalogue\Enums\PropertyInputType; use Eclipse\Catalogue\Filament\Filters\CustomPropertyConstraint; -use Eclipse\Catalogue\Filament\Forms\Components\ImageManager; use Eclipse\Catalogue\Filament\Resources\ProductResource\Pages\CreateProduct; use Eclipse\Catalogue\Filament\Resources\ProductResource\Pages\EditProduct; use Eclipse\Catalogue\Filament\Resources\ProductResource\Pages\ListProducts; @@ -21,6 +20,7 @@ use Eclipse\Catalogue\Support\LabelType; use Eclipse\Catalogue\Traits\HandlesTenantData; use Eclipse\Catalogue\Traits\HasTenantFields; +use Eclipse\Common\Filament\Forms\Components\MediaGallery; use Eclipse\World\Models\Country; use Eclipse\World\Models\TariffCode; use Filament\Actions\ActionGroup; @@ -560,10 +560,14 @@ function ($query) { Tab::make('Images') ->schema([ - ImageManager::make('images') + MediaGallery::make('images') ->label('') ->collection('images') ->acceptedFileTypes(['image/jpeg', 'image/png', 'image/gif', 'image/webp']) + ->allowUploads() + ->preview() + ->orderable() + ->mediaColumns(4) ->columnSpanFull(), ]), ]) diff --git a/src/Filament/Resources/ProductResource/Pages/CreateProduct.php b/src/Filament/Resources/ProductResource/Pages/CreateProduct.php index ade8f0b..d86a3e2 100644 --- a/src/Filament/Resources/ProductResource/Pages/CreateProduct.php +++ b/src/Filament/Resources/ProductResource/Pages/CreateProduct.php @@ -11,7 +11,6 @@ use Eclipse\Catalogue\Traits\HandlesTenantData; use Eclipse\Catalogue\Traits\HasTenantFields; use Filament\Resources\Pages\CreateRecord; -use Filament\Schemas\Schema; use Illuminate\Database\Eloquent\Model; use LaraZeus\SpatieTranslatable\Actions\LocaleSwitcher; use LaraZeus\SpatieTranslatable\Resources\Pages\CreateRecord\Concerns\Translatable; @@ -33,6 +32,11 @@ protected function getHeaderActions(): array protected function mutateFormDataBeforeCreate(array $data): array { + if (isset($data['images'])) { + $this->temporaryImages = $data['images']; + unset($data['images']); + } + foreach (array_keys($data) as $key) { if (str_starts_with($key, 'property_values_') || str_starts_with($key, 'custom_property_')) { unset($data[$key]); @@ -52,11 +56,6 @@ protected function getFormMutuallyExclusiveFlagSets(): array return []; } - public function form(Schema $schema): Schema - { - return $schema; - } - protected function handleRecordCreation(array $data): Model { $tenantData = $this->extractTenantDataFromFormData($data); @@ -94,6 +93,60 @@ protected function afterCreate(): void return; } + // Handle image uploads (from HandlesImageUploads trait logic) + $pendingImages = $this->temporaryImages; + + if (! empty($pendingImages) && is_array($pendingImages)) { + foreach ($pendingImages as $index => $item) { + if (isset($item['temp_file'])) { + $tempPath = storage_path('app/public/'.$item['temp_file']); + + if (file_exists($tempPath)) { + $this->record->addMedia($tempPath) + ->usingFileName($item['file_name'] ?? basename($tempPath)) + ->withCustomProperties([ + 'name' => $item['name'] ?? [], + 'description' => $item['description'] ?? [], + 'is_cover' => $item['is_cover'] ?? false, + 'position' => $index, + ]) + ->toMediaCollection('images'); + + @unlink($tempPath); + } + } elseif (isset($item['temp_url'])) { + try { + $this->record->addMediaFromUrl($item['temp_url']) + ->usingFileName($item['file_name'] ?? basename($item['temp_url'])) + ->withCustomProperties([ + 'name' => $item['name'] ?? [], + 'description' => $item['description'] ?? [], + 'is_cover' => $item['is_cover'] ?? false, + 'position' => $index, + ]) + ->toMediaCollection('images'); + } catch (\Exception $e) { + } + } + } + + $coverMedia = $this->record->getMedia('images') + ->filter(fn ($media) => $media->getCustomProperty('is_cover', false)); + + if ($coverMedia->count() > 1) { + $coverMedia->skip(1)->each(function ($media) { + $media->setCustomProperty('is_cover', false); + $media->save(); + }); + } + + if ($coverMedia->count() === 0 && $this->record->getMedia('images')->count() > 0) { + $firstMedia = $this->record->getMedia('images')->first(); + $firstMedia->setCustomProperty('is_cover', true); + $firstMedia->save(); + } + } + $state = $this->form->getState(); $rawState = $this->form->getRawState(); $tenantData = $state['tenant_data'] ?? []; diff --git a/src/Filament/Resources/ProductResource/Pages/EditProduct.php b/src/Filament/Resources/ProductResource/Pages/EditProduct.php index c883989..6c2bf78 100644 --- a/src/Filament/Resources/ProductResource/Pages/EditProduct.php +++ b/src/Filament/Resources/ProductResource/Pages/EditProduct.php @@ -15,7 +15,6 @@ use Filament\Actions\ViewAction; use Filament\Facades\Filament; use Filament\Resources\Pages\EditRecord; -use Filament\Schemas\Schema; use Illuminate\Database\Eloquent\Model; use LaraZeus\SpatieTranslatable\Actions\LocaleSwitcher; use LaraZeus\SpatieTranslatable\Resources\Pages\EditRecord\Concerns\Translatable; @@ -217,11 +216,6 @@ protected function getFormMutuallyExclusiveFlagSets(): array return []; } - public function form(Schema $schema): Schema - { - return $schema; - } - protected function getFormActions(): array { return [ From b862dd4786125fe747d3dabf04510f943e5b21dc Mon Sep 17 00:00:00 2001 From: thapacodes4u Date: Sun, 19 Oct 2025 05:17:11 +0545 Subject: [PATCH 2/2] fix: removing duplicate code --- .../ProductResource/Pages/CreateProduct.php | 58 ++----------------- 1 file changed, 4 insertions(+), 54 deletions(-) diff --git a/src/Filament/Resources/ProductResource/Pages/CreateProduct.php b/src/Filament/Resources/ProductResource/Pages/CreateProduct.php index d86a3e2..6c0d2cb 100644 --- a/src/Filament/Resources/ProductResource/Pages/CreateProduct.php +++ b/src/Filament/Resources/ProductResource/Pages/CreateProduct.php @@ -17,7 +17,9 @@ class CreateProduct extends CreateRecord { - use HandlesImageUploads; + use HandlesImageUploads { + afterCreate as handleImageUploadsAfterCreate; + } use HandlesTenantData, HasTenantFields; use Translatable; @@ -93,59 +95,7 @@ protected function afterCreate(): void return; } - // Handle image uploads (from HandlesImageUploads trait logic) - $pendingImages = $this->temporaryImages; - - if (! empty($pendingImages) && is_array($pendingImages)) { - foreach ($pendingImages as $index => $item) { - if (isset($item['temp_file'])) { - $tempPath = storage_path('app/public/'.$item['temp_file']); - - if (file_exists($tempPath)) { - $this->record->addMedia($tempPath) - ->usingFileName($item['file_name'] ?? basename($tempPath)) - ->withCustomProperties([ - 'name' => $item['name'] ?? [], - 'description' => $item['description'] ?? [], - 'is_cover' => $item['is_cover'] ?? false, - 'position' => $index, - ]) - ->toMediaCollection('images'); - - @unlink($tempPath); - } - } elseif (isset($item['temp_url'])) { - try { - $this->record->addMediaFromUrl($item['temp_url']) - ->usingFileName($item['file_name'] ?? basename($item['temp_url'])) - ->withCustomProperties([ - 'name' => $item['name'] ?? [], - 'description' => $item['description'] ?? [], - 'is_cover' => $item['is_cover'] ?? false, - 'position' => $index, - ]) - ->toMediaCollection('images'); - } catch (\Exception $e) { - } - } - } - - $coverMedia = $this->record->getMedia('images') - ->filter(fn ($media) => $media->getCustomProperty('is_cover', false)); - - if ($coverMedia->count() > 1) { - $coverMedia->skip(1)->each(function ($media) { - $media->setCustomProperty('is_cover', false); - $media->save(); - }); - } - - if ($coverMedia->count() === 0 && $this->record->getMedia('images')->count() > 0) { - $firstMedia = $this->record->getMedia('images')->first(); - $firstMedia->setCustomProperty('is_cover', true); - $firstMedia->save(); - } - } + $this->handleImageUploadsAfterCreate(); $state = $this->form->getState(); $rawState = $this->form->getRawState();