Di sini kita akan belajar cara membuat badge status dengan bantuan enum di dalam filament.
Table Structure
Untuk lebih jelasnya, di sini saya punya tabel yang kurang lebih structure nya seperti:
Lesson:
title: string
description: text
time_limit_seconds: int
start_date: datetime
end_date: datetime
Perhatikan pada column start_date dan end_date, dimana kolom ini akan kita jadikan sebagai pemicu dari status yang akan tampil nantinya di tabel kita.
Attribute
Karena kita tidak mempunyai kolom status, maka status itu kita bisa jadikan attribute pada model Lesson (sebagai contoh). Maka yang bisa kita lakukan adalah:
protected function status(): Attribute
{
return Attribute::make(
get: fn () => $this->calculateStatus(),
);
}
Kemudian selanjutnya, kita akan membuat private method tepat di bawah attribute status ini seperti:
private function calculateStatus(): string
{
$today = Carbon::today();
if ($this->start_date && $this->start_date->isFuture()) {
return 'Upcoming';
} elseif ($this->end_date && $this->end_date->isPast()) {
return 'Expired';
} elseif ($this->start_date && $this->end_date && $today->between($this->start_date, $this->end_date)) {
return 'Active';
}
return 'Unavailable';
}
Dan tentu, untuk pemanggilannya itu sangat mudah dengan menggunakan formatStateUsing seperti:
Tables\Columns\TextColumn::make('status')->badge()
Namun, jika kita membutuhkan warna, itu sangat akan merepotkan dan juga membuat file Resource ini menjadi sangat terlihat berantakan. Maka untuk itu, kita akan menggunakan enum untuk membuat kode kita jauh lebih rapi.
Enum
Pertama, silakan generate enum nya dengan membuat perintah seperti:
php artisan make:enum Enums/LessonStatus
Setelah itu, silakan buka file nya dan tambahkan kode seperti:
namespace App\Enums;
use Filament\Support\Contracts\HasLabel;
enum LessonStatus: string implements HasLabel
{
case Upcoming = 'Upcoming';
case Active = 'Active';
case Expired = 'Expired';
case Unavailable = 'Unavailable';
public function getLabel(): ?string
{
return $this->value;
}
public function getColor(): ?string
{
return match ($this) {
self::Upcoming => 'primary',
self::Active => 'success',
self::Expired => 'danger',
self::Unavailable => 'warning',
default => 'default',
};
}
}
Perlu diperhatikan bahwa implementasi label di sini membantu dalam pembuatan select di form filament, meskipun tidak digunakan dalam kasus ini. Saya hanya ingin menunjukkan kemampuan enum di filament. Fokus kita adalah pada method getColor, di mana saya telah menentukan warna untuk setiap status dari enum tersebut. Sekarang, tugas kita adalah memodifikasi isi dari method calculateStatus pada model Lesson.
private function calculateStatus(): LessonStatus
{
if ($this->start_date && $this->start_date->isFuture()) {
return LessonStatus::Upcoming;
} elseif ($this->end_date && $this->end_date->isPast()) {
return LessonStatus::Expired;
} elseif ($this->start_date && $this->end_date && today()->between($this->start_date, $this->end_date)) {
return LessonStatus::Active;
}
return LessonStatus::Unavailable;
}
Dengan begitu, maka sekarang kita dapat dengan mudah membuat warna pada tabel yang ada di filament dengan memanggil getColor yang ada pada enum tadi.
Tables\Columns\TextColumn::make('status')
->badge()
->color(fn ($state) => $state->getColor()),
Dengan begitu, maka sekarang status akan sudah menampilkan warna sesuai dari start_date yang telah Anda buat.
Course
Jika Anda tertarik mempelajari filament lebih lanjut, maka Anda bisa lihat pada seri: Belajar Laravel Filament Dari Awal.
Kesimpulan
Enum di PHP adalah fitur yang memungkinkan pembuatan tipe data khusus yang menyimpan sekumpulan nilai tetap dan terbatas. Ini meningkatkan keamanan dan kejelasan dalam pengkodean dengan memastikan bahwa hanya nilai-nilai yang telah didefinisikan sebelumnya yang dapat digunakan.
Semoga artikel ini bermanfaat, saya Irsyad, dan sampai jumpa di artikel selanjutnya.
Irsyad A. Panjaitan
Let's start living like no one can help us in any event, so that when we are helped in certain times, it becomes a plus in itself.
Artikel yang Terkait
- Belajar Cache Flexible di Laravel
Irsyad A. Panjaitan
- Membuat Fitur Multi Bahasa di Laravel Inertia React
Irsyad A. Panjaitan
- Laravel Script: composer run dev
Irsyad A. Panjaitan
- Apa yang Baru di Inertia.js 2.0
Irsyad A. Panjaitan
- Membuat Custom Rule Validator untuk Nomor Telepon Indonesia dengan Laravel
Abd. Asis
- Like System dengan Laravel Polymorphic
Irsyad A. Panjaitan
- Laravel Dengan Multi Koneksi Database: Panduan Langkah demi Langkah
Abd. Asis