Pelajari langkah demi langkah penggunaan Enum di Filament untuk kode yang lebih optimal dan mudah di maintenance.
Di sini kita akan belajar cara membuat badge status dengan bantuan enum di dalam filament.
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.
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.
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.
Jika Anda tertarik mempelajari filament lebih lanjut, maka Anda bisa lihat pada seri: Belajar Laravel Filament Dari Awal.
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.
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.