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 @@
Lampiran Tugas
-{{ $this->record->getFirstMedia('assignments')?->file_name ?? 'Berkas Lampiran' }}
+Klik tombol di samping untuk mengunduh berkas.
+File yang Terakhir Dikumpulkan
-{{ $this->existingSubmission?->getFirstMedia('submission')?->file_name ?? 'Berkas Tugas' }}
+Berkas non-PDF (ZIP)
+File yang telah dikumpulkan oleh kelompok Anda:
-{{ $this->existingSubmission?->getFirstMedia('submission')?->file_name ?? 'Berkas Tugas' }}
+File Terkumpul Saat Ini
-{{ $this->existingSubmission?->getFirstMedia('submission')?->file_name ?? 'Berkas Tugas' }}
+Berkas Terkumpul (ZIP)
+