feat: Integrate cheerful notifications into decision and verification enums, enhancing user feedback with engaging messages across the admin verification page.

This commit is contained in:
Yoga Pangestu 2026-03-27 10:18:14 +07:00
parent be8408f9b3
commit 63843ff18d
5 changed files with 37 additions and 16 deletions

View File

@ -2,6 +2,7 @@
namespace App\Enums;
use App\Filament\Support\CheerfulNotification;
use App\Traits\Enum\WithComment;
use App\Traits\Enum\WithValue;
use Filament\Support\Contracts\HasColor;
@ -18,9 +19,9 @@ enum DecisionAdmin: int implements HasColor, HasLabel
public function getLabel(): ?string
{
return match ($this) {
self::APPROVED => 'Disetujui',
self::NEED_REVISION => 'Perlu Revisi',
self::REJECTED => 'Ditolak',
self::APPROVED => CheerfulNotification::getMessage('Sudah Disetujui! ✅🚀', 'Disetujui'),
self::NEED_REVISION => CheerfulNotification::getMessage('Perlu Revisi nih! ✍️🛠️', 'Perlu Revisi'),
self::REJECTED => CheerfulNotification::getMessage('Ditolak, Tetap Semangat! 🛑😔', 'Ditolak'),
};
}

View File

@ -2,6 +2,7 @@
namespace App\Enums;
use App\Filament\Support\CheerfulNotification;
use App\Traits\Enum\WithComment;
use App\Traits\Enum\WithValue;
use Filament\Support\Contracts\HasColor;
@ -19,10 +20,10 @@ enum VerificationStatus: int implements HasColor, HasLabel
public function getLabel(): ?string
{
return match ($this) {
self::PENDING => 'Menunggu Verifikasi',
self::APPROVED => 'Disetujui',
self::NEED_REVISION => 'Perlu Revisi',
self::REJECTED => 'Ditolak',
self::PENDING => CheerfulNotification::getMessage('Menunggu Verifikasi ⏳✨', 'Menunggu Verifikasi'),
self::APPROVED => CheerfulNotification::getMessage('Sudah Disetujui! ✅🚀', 'Disetujui'),
self::NEED_REVISION => CheerfulNotification::getMessage('Perlu Revisi nih! ✍️🛠️', 'Perlu Revisi'),
self::REJECTED => CheerfulNotification::getMessage('Ditolak, Tetap Semangat! 🛑😔', 'Ditolak'),
};
}

View File

@ -165,6 +165,12 @@ public function verifications(): LengthAwarePaginator
'createdAt' => $review->created_at->translatedFormat('l, d M Y H:i'),
]),
],
'messages' => [
'detail' => CheerfulNotification::getMessage('Detail Data 🔍✨', 'Detail'),
'revision' => CheerfulNotification::getMessage('Sabar ya, pengguna lagi sibuk revisi data nih! ⏳✍️', 'Menunggu revisi dari pengguna...'),
'approved' => CheerfulNotification::getMessage('Yeay! Verifikasi sudah beres dan disetujui! ✅🚀', 'Verifikasi selesai'),
'rejected' => CheerfulNotification::getMessage('Yah, pengajuannya terpaksa belum bisa diterima. 🛑😔', 'Pengajuan ditolak'),
],
];
});
}
@ -245,4 +251,14 @@ public function rejectAction(): Action
{
return RejectAction::make();
}
public function getEmptyStateHeading(): string
{
return CheerfulNotification::getMessage('Belum ada pengajuan verifikasi nih! 📭✨', 'Tidak ada pengajuan verifikasi');
}
public function getEmptyStateDescription(): string
{
return CheerfulNotification::getMessage('Tenang saja, mungkin sebentar lagi bakal ada yang kirim pengajuan verifikasi. Ditunggu saja ya! 😊⏳', 'Belum ada pengajuan verifikasi dari user.');
}
}

View File

@ -212,9 +212,9 @@ public static function table(Table $table): Table
->deferFilters(false)
->paginated([25, 50, 100, 'all'])
->deferLoading()
->when(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value) && ! auth()->user()->company?->partnerMedia, function (Table $table): Table {
->when(fn () => auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value) && ! auth()->user()->company?->partnerMedia, function (Table $table): Table {
return $table
->emptyStateHeading('Akses Dibatasi')
->emptyStateHeading(fn () => CheerfulNotification::getMessage('Wah, Pintunya Dikunci Nih! 🔒✨', 'Akses Dibatasi'))
->emptyStateDescription(fn () => CheerfulNotification::getMessage('Ups! Silakan lengkapi data media Anda dulu ya sebelum mengelola jurnalis. ✨📝', 'Silakan lengkapi data media Anda terlebih dahulu untuk dapat mengelola informasi jurnalis.'))
->emptyStateIcon(Heroicon::OutlinedLockClosed)
->emptyStateActions([
@ -236,7 +236,7 @@ public static function getPages(): array
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->when(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value) && ! auth()->user()->company?->partnerMedia, function (Builder $query): Builder {
->when(fn () => auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value) && ! auth()->user()->company?->partnerMedia, function (Builder $query): Builder {
return $query->whereRaw('1 = 0');
})
->when(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value), function (Builder $query): Builder {

View File

@ -228,7 +228,7 @@ class="w-4 h-4 text-gray-500 transition-transform duration-200"
@if ($verification['company']['detailUrl'])
<x-filament::button color="gray" size="sm" icon="heroicon-o-eye" tag="a"
:href="$verification['company']['detailUrl']">
Detail
{{ $verification['messages']['detail'] }}
</x-filament::button>
@endif
@ -241,19 +241,19 @@ class="w-4 h-4 text-gray-500 transition-transform duration-200"
<span
class="flex items-center gap-1 text-xs text-warning-600 dark:text-warning-400 font-medium italic">
<x-heroicon-s-clock class="w-3 h-3 animate-pulse" />
Menunggu revisi dari pengguna...
{{ $verification['messages']['revision'] }}
</span>
@elseif($verification['status']['isApproved'])
<span
class="flex items-center gap-1 text-xs text-success-600 dark:text-success-400 font-medium">
<x-heroicon-s-check-circle class="w-3 h-3" />
Verifikasi selesai
{{ $verification['messages']['approved'] }}
</span>
@elseif($verification['status']['isRejected'])
<span
class="flex items-center gap-1 text-xs text-danger-600 dark:text-danger-400 font-medium">
<x-heroicon-s-x-circle class="w-3 h-3" />
Pengajuan ditolak
{{ $verification['messages']['rejected'] }}
</span>
@endif
</div>
@ -261,8 +261,11 @@ class="flex items-center gap-1 text-xs text-danger-600 dark:text-danger-400 font
</x-filament::section>
@empty
<div class="col-span-full">
<x-filament::empty-state icon="heroicon-o-inbox" heading="Tidak ada pengajuan verifikasi"
description="Belum ada pengajuan verifikasi dari user." iconColor="gray">
<x-filament::empty-state
icon="heroicon-o-inbox"
:heading="$this->getEmptyStateHeading()"
:description="$this->getEmptyStateDescription()"
icon-color="gray">
</x-filament::empty-state>
</div>
@endforelse