From 1f0db96179d8a0e5c7157fcc1be9d7c1f9767d55 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sat, 18 Apr 2026 21:51:25 +0700 Subject: [PATCH] feat: add download support for non-PDF files in assignment submission views --- .../Pages/SubmissionDetailPage.php | 30 +++++ .../Pages/SubmitAssignmentPage.php | 20 ++++ .../Assignments/Schemas/AssignmentForm.php | 4 +- .../Schemas/SubmitAssignmentForm.php | 6 +- .../assignments/submission-detail.blade.php | 21 +++- .../assignments/submit-assignment.blade.php | 107 ++++++++++++++---- 6 files changed, 157 insertions(+), 31 deletions(-) diff --git a/app/Filament/Resources/Learning/Assignments/Pages/SubmissionDetailPage.php b/app/Filament/Resources/Learning/Assignments/Pages/SubmissionDetailPage.php index b53994d..1381b0d 100644 --- a/app/Filament/Resources/Learning/Assignments/Pages/SubmissionDetailPage.php +++ b/app/Filament/Resources/Learning/Assignments/Pages/SubmissionDetailPage.php @@ -11,6 +11,7 @@ use App\Models\Assignment; use App\Models\AssignmentSubmission; use Filament\Actions\Action; +use Filament\Infolists\Components\TextEntry; use Filament\Resources\Pages\Page; use Filament\Support\Enums\Width; use Illuminate\Support\Arr; @@ -100,6 +101,8 @@ public function submissionSummary(): Collection 'submitted' => $isSubmitted, 'submitted_at_formatted' => $isSubmitted ? $submission?->submitted_at?->translatedFormat('l, d F Y H:i') : '-', 'has_file' => $isSubmitted && $submission->hasMedia('submission'), + 'is_pdf' => $isSubmitted && str_ends_with(strtolower($submission->getFirstMediaUrl('submission')), '.pdf'), + 'file_url' => $isSubmitted ? $submission->getFirstMediaUrl('submission') : null, 'status_classes' => Arr::toCssClasses([ 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium', 'bg-success-100 text-success-700 dark:bg-success-900/30 dark:text-success-400' => $isSubmitted, @@ -129,6 +132,8 @@ public function submissionSummary(): Collection 'submitted' => $isSubmitted, 'submitted_at_formatted' => $isSubmitted ? $submission->submitted_at?->translatedFormat('l, d F Y H:i') : '-', 'has_file' => $isSubmitted && $submission->hasMedia('submission'), + 'is_pdf' => $isSubmitted && str_ends_with(strtolower($submission->getFirstMediaUrl('submission')), '.pdf'), + 'file_url' => $isSubmitted ? $submission->getFirstMediaUrl('submission') : null, 'status_classes' => Arr::toCssClasses([ 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium', 'bg-success-100 text-success-700 dark:bg-success-900/30 dark:text-success-400' => $isSubmitted, @@ -195,14 +200,39 @@ public function previewSubmissionAction(): Action ->modalWidth(Width::SixExtraLarge) ->infolist([ PdfViewerEntry::make('submission') + ->visible(fn (AssignmentSubmission $record) => str_ends_with(strtolower($record->getFirstMediaUrl('submission')), '.pdf')) ->hiddenLabel() ->fileUrl(fn (AssignmentSubmission $record) => $record->getFirstMediaUrl('submission')) ->columnSpanFull(), + + TextEntry::make('download_file') + ->label('Berkas non-PDF') + ->visible(fn (AssignmentSubmission $record) => ! str_ends_with(strtolower($record->getFirstMediaUrl('submission')), '.pdf')) + ->hint('Klik ikon unduh untuk melihat isi berkas.') + ->default(fn (AssignmentSubmission $record) => $record->getFirstMedia('submission')?->file_name ?? 'Unduh Berkas') + ->suffixAction( + Action::make('download') + ->label('Unduh') + ->icon('heroicon-o-arrow-down-tray') + ->url(fn (AssignmentSubmission $record) => $record->getFirstMediaUrl('submission'), true) + ), ]) ->modalSubmitAction(false) ->modalCancelActionLabel('Tutup'); } + public function downloadMedia(int $submissionId) + { + $submission = AssignmentSubmission::findOrFail($submissionId); + $media = $submission->getFirstMedia('submission'); + + if (! $media) { + return; + } + + return response()->download($media->getPath(), $media->file_name); + } + protected function getHeaderActions(): array { return [ diff --git a/app/Filament/Resources/Learning/Assignments/Pages/SubmitAssignmentPage.php b/app/Filament/Resources/Learning/Assignments/Pages/SubmitAssignmentPage.php index 4bb2285..38950db 100644 --- a/app/Filament/Resources/Learning/Assignments/Pages/SubmitAssignmentPage.php +++ b/app/Filament/Resources/Learning/Assignments/Pages/SubmitAssignmentPage.php @@ -248,6 +248,26 @@ public function getSubmissionFileUrl(): ?string return $this->existingSubmission?->getFirstMediaUrl('submission'); } + public function downloadAttachment() + { + $media = $this->record->getFirstMedia('assignments'); + if (! $media) { + return; + } + + return response()->download($media->getPath(), $media->file_name); + } + + public function downloadSubmission() + { + $media = $this->existingSubmission?->getFirstMedia('submission'); + if (! $media) { + return; + } + + return response()->download($media->getPath(), $media->file_name); + } + public function submit(): void { $student = $this->student; diff --git a/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php b/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php index 3a2cfb7..46bed93 100644 --- a/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php +++ b/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php @@ -111,7 +111,7 @@ public static function configure(Schema $schema): Schema ->columnSpanFull(), AdvancedFileUpload::make('pdf') - ->label('Lampiran PDF') + ->label('Lampiran Berkas') ->pdfPreviewHeight(400) ->pdfDisplayPage(1) ->pdfToolbar(true) @@ -119,7 +119,7 @@ public static function configure(Schema $schema): Schema ->pdfFitType(PdfViewFit::FIT) ->pdfNavPanes(true) ->disk(config('filesystems.default')) - ->acceptedFileTypes(['application/pdf']) + ->acceptedFileTypes(['application/pdf', 'application/zip', 'application/x-zip-compressed', 'application/x-zip', 'application/octet-stream', 'multipart/x-zip', '.zip', '.7z']) ->maxSize(1024 * 5) ->directory('assignments-tmp/'.now()->toDateString()) ->nullable() diff --git a/app/Filament/Resources/Learning/Assignments/Schemas/SubmitAssignmentForm.php b/app/Filament/Resources/Learning/Assignments/Schemas/SubmitAssignmentForm.php index 6b2c332..b0f6db4 100644 --- a/app/Filament/Resources/Learning/Assignments/Schemas/SubmitAssignmentForm.php +++ b/app/Filament/Resources/Learning/Assignments/Schemas/SubmitAssignmentForm.php @@ -13,7 +13,7 @@ public static function configure(Schema $schema): Schema return $schema ->components([ AdvancedFileUpload::make('file') - ->label(fn ($get) => $get('is_resubmit') ? 'Ganti Berkas PDF (Opsional)' : 'Lampiran Berkas Tugas') + ->label(fn ($get) => $get('is_resubmit') ? 'Ganti Berkas Tugas (Opsional)' : 'Lampiran Berkas Tugas') ->pdfPreviewHeight(400) ->pdfDisplayPage(1) ->pdfToolbar(true) @@ -21,12 +21,12 @@ public static function configure(Schema $schema): Schema ->pdfFitType(PdfViewFit::FIT) ->pdfNavPanes(true) ->disk(config('filesystems.default')) - ->acceptedFileTypes(['application/pdf']) + ->acceptedFileTypes(['application/pdf', 'application/zip', 'application/x-zip-compressed', 'application/x-zip', 'application/octet-stream', 'multipart/x-zip', '.zip', '.7z']) ->maxSize(1024 * 5) ->directory('submissions/'.now()->toDateString()) ->required(fn ($get) => ! $get('is_resubmit')) ->hiddenLabel() - ->helperText('Hanya file PDF dengan ukuran maksimal 5MB.') + ->helperText('File PDF atau ZIP dengan ukuran maksimal 5MB.') ->columnSpanFull(), ]); } diff --git a/resources/views/filament/resources/learning/assignments/submission-detail.blade.php b/resources/views/filament/resources/learning/assignments/submission-detail.blade.php index 6e18b74..c996b97 100644 --- a/resources/views/filament/resources/learning/assignments/submission-detail.blade.php +++ b/resources/views/filament/resources/learning/assignments/submission-detail.blade.php @@ -101,12 +101,21 @@ @if ($item->has_file) - + @if ($item->is_pdf) + + @else + + @endif @else - @endif diff --git a/resources/views/filament/resources/learning/assignments/submit-assignment.blade.php b/resources/views/filament/resources/learning/assignments/submit-assignment.blade.php index 88dafd4..0a5e4af 100644 --- a/resources/views/filament/resources/learning/assignments/submit-assignment.blade.php +++ b/resources/views/filament/resources/learning/assignments/submit-assignment.blade.php @@ -35,11 +35,28 @@ class="prose prose-sm dark:prose-invert max-w-none text-gray-600 dark:text-gray- @if ($attachmentUrl = $this->record->getFirstMediaUrl('assignments'))

Lampiran Tugas

-
- -
+ @if (str_ends_with(strtolower($attachmentUrl), '.pdf')) +
+ +
+ @else +
+
+
+ +
+
+

{{ $this->record->getFirstMedia('assignments')?->file_name ?? 'Berkas Lampiran' }}

+

Klik tombol di samping untuk mengunduh berkas.

+
+
+ + Unduh + +
+ @endif
@endif @@ -63,11 +80,28 @@ class="flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-dange @if ($url = $this->getSubmissionFileUrl())

File yang Terakhir Dikumpulkan

-
- -
+ @if (str_ends_with(strtolower($url), '.pdf')) +
+ +
+ @else +
+
+
+ +
+
+

{{ $this->existingSubmission?->getFirstMedia('submission')?->file_name ?? 'Berkas Tugas' }}

+

Berkas non-PDF (ZIP)

+
+
+ + Unduh + +
+ @endif
@endif @@ -86,11 +120,27 @@ class="flex flex-col items-center justify-center py-8 text-center text-gray-500

File yang telah dikumpulkan oleh kelompok Anda:

-
- -
+ @if (str_ends_with(strtolower($url), '.pdf')) +
+ +
+ @else +
+
+
+ +
+
+

{{ $this->existingSubmission?->getFirstMedia('submission')?->file_name ?? 'Berkas Tugas' }}

+
+
+ + Unduh + +
+ @endif
@endif @@ -112,11 +162,28 @@ class="block border-0"> @if ($this->isResubmit && ($url = $this->getSubmissionFileUrl()))

File Terkumpul Saat Ini

-
- -
+ @if (str_ends_with(strtolower($url), '.pdf')) +
+ +
+ @else +
+
+
+ +
+
+

{{ $this->existingSubmission?->getFirstMedia('submission')?->file_name ?? 'Berkas Tugas' }}

+

Berkas Terkumpul (ZIP)

+
+
+ + Unduh + +
+ @endif
@endif