feat: Enhance cooperation management with proposal template handling and media uploads

This commit is contained in:
Yoga Pangestu 2026-01-09 12:40:50 +07:00
parent 1a3f0610a3
commit 7e1c688c78
4 changed files with 85 additions and 6 deletions

View File

@ -5,6 +5,7 @@
use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use Filament\Actions\Action;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Facades\Storage;
class CreateCooperation extends CreateRecord
{
@ -27,4 +28,32 @@ protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('index');
}
protected function afterCreate(): void
{
$record = $this->getRecord();
$data = $this->data;
if (empty($data['proposal_template'])) {
return;
}
$filePath = collect($data['proposal_template'])->first();
$fullPath = Storage::disk(config('filesystems.default'))->path($filePath);
if (! file_exists($fullPath)) {
return;
}
$record
->addMediaFromDisk($filePath, config('filesystems.default'))
->preservingOriginal()
->withCustomProperties([
'feature' => 'cooperations',
'date' => now()->toDateString(),
'doc_type' => 'proposal-template',
])
->toMediaCollection('cooperations');
}
}

View File

@ -3,13 +3,34 @@
namespace App\Filament\Resources\Manage\Cooperations\Pages;
use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Models\Cooperation;
use Filament\Actions\Action;
use Filament\Resources\Pages\EditRecord;
use Illuminate\Support\Facades\Storage;
class EditCooperation extends EditRecord
{
protected static string $resource = CooperationResource::class;
public function mount(int|string $record): void
{
parent::mount($record);
$media = Cooperation::find($record)
->getMedia('cooperations')
->where('custom_properties.doc_type', 'proposal-template')
->sortByDesc('created_at')
->first();
if (! $media) {
return;
}
$this->data['proposal_template'] = [
$media->uuid => $media->getPathRelativeToRoot(),
];
}
protected function getHeaderActions(): array
{
return [
@ -25,4 +46,32 @@ protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('index');
}
protected function afterSave(): void
{
$record = $this->getRecord();
$data = $this->data;
if (empty($data['proposal_template'])) {
return;
}
$filePath = collect($data['proposal_template'])->first();
$fullPath = Storage::disk(config('filesystems.default'))->path($filePath);
if (! file_exists($fullPath)) {
return;
}
$record
->addMediaFromDisk($filePath, config('filesystems.default'))
->preservingOriginal()
->withCustomProperties([
'feature' => 'cooperations',
'date' => now()->toDateString(),
'doc_type' => 'proposal-template',
])
->toMediaCollection('cooperations');
}
}

View File

@ -3,6 +3,7 @@
namespace App\Filament\Resources\Manage\Cooperations\Schemas;
use App\Models\PartnerMedia;
use Asmit\FilamentUpload\Forms\Components\AdvancedFileUpload;
use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Select;
@ -83,15 +84,15 @@ public static function configure(Schema $schema): Schema
->disk(config('filesystems.default'))
->acceptedFileTypes(['image/*'])
->maxSize(1024 * 3)
->collection('cooperation')
->collection('banners')
->image(),
SpatieMediaLibraryFileUpload::make('proposal_template')
AdvancedFileUpload::make('proposal_template')
->label('Template Pengajuan')
->disk(config('filesystems.default'))
->acceptedFileTypes(['application/pdf'])
->maxSize(1024 * 10)
->collection('cooperation')
->directory('cooperations/templates/'.now()->toDateString())
->required(),
]),
])

View File

@ -90,9 +90,9 @@ public static function configure(Table $table): Table
->html()
->getStateUsing(function (Cooperation $record) {
$record->loadCount([
'partnerMedia as approved_count' => fn ($query) => $query->where('status', ApprovalStatus::ACCEPTED),
'partnerMedia as rejected_count' => fn ($query) => $query->where('status', ApprovalStatus::REJECTED),
'partnerMedia as pending_count' => fn ($query) => $query->where('status', ApprovalStatus::PENDING),
'partnerMedia as approved_count' => fn ($query) => $query->where('cooperations.status', ApprovalStatus::ACCEPTED),
'partnerMedia as rejected_count' => fn ($query) => $query->where('cooperations.status', ApprovalStatus::REJECTED),
'partnerMedia as pending_count' => fn ($query) => $query->where('cooperations.status', ApprovalStatus::PENDING),
]);
$totalCount = $record->partnerMedia()->count();