Kamis, 18 April 2024

Enum di Filament adalah Sinergi Sempurna

Pelajari langkah demi langkah penggunaan Enum di Filament untuk kode yang lebih optimal dan mudah di maintenance.

Laravel
Filament

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:

Lesson.php
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:

Lesson.php
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:

LessonResource.php
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:

app/Enums/LessonStatus.php
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.

Lesson.php
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.

LessonResource.php
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.