refactor: centralize cheerful notifications and cleanup auth calls

- Introduce `CheerfulNotification` utility class to standardize cheerful and expressive notifications across the application.
- Refactor custom "Cheerful" actions (Create, Edit, Delete, etc.) and `DefaultBulkActions` to utilize the new utility class.
- Update all `ToggleColumn` status updates in Master Data modules to use `CheerfulNotification::statusUpdated()`.
- Replace inline `Notification::make()` calls in custom actions (Reply, Crawl News, Cooperation actions) and Resource Pages with `CheerfulNotification` methods.
- Address various lint errors by standardizing the use of the `Auth` facade and improving type hinting for the authenticated `User` model.
This commit is contained in:
Yoga Pangestu 2026-01-14 09:54:46 +07:00
parent ab318a030b
commit 2983cd243f
54 changed files with 552 additions and 149 deletions

View File

@ -0,0 +1,18 @@
<?php
namespace App\Filament\Actions\Cheerful;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\CreateAction as ActionsCreateAction;
class CreateAction extends ActionsCreateAction
{
protected function setUp(): void
{
parent::setUp();
$this->successNotification(
CheerfulNotification::create()
);
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Filament\Actions\Cheerful;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\DeleteAction as ActionsDeleteAction;
class DeleteAction extends ActionsDeleteAction
{
protected function setUp(): void
{
parent::setUp();
$this->successNotification(
CheerfulNotification::delete()
);
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Filament\Actions\Cheerful;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\EditAction as ActionsEditAction;
class EditAction extends ActionsEditAction
{
protected function setUp(): void
{
parent::setUp();
$this->successNotification(
CheerfulNotification::update()
);
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Filament\Actions\Cheerful;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\ForceDeleteAction as ActionsForceDeleteAction;
class ForceDeleteAction extends ActionsForceDeleteAction
{
protected function setUp(): void
{
parent::setUp();
$this->successNotification(
CheerfulNotification::forceDelete()
);
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Filament\Actions\Cheerful;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\RestoreAction as ActionsRestoreAction;
class RestoreAction extends ActionsRestoreAction
{
protected function setUp(): void
{
parent::setUp();
$this->successNotification(
CheerfulNotification::restore()
);
}
}

View File

@ -2,6 +2,7 @@
namespace App\Filament\Actions; namespace App\Filament\Actions;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\ForceDeleteBulkAction; use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction; use Filament\Actions\RestoreBulkAction;
@ -12,13 +13,22 @@ public static function make(string $entity): array
{ {
return [ return [
DeleteBulkAction::make() DeleteBulkAction::make()
->modalHeading("Hapus {$entity} yang dipilih"), ->modalHeading("Hapus {$entity} yang dipilih")
->successNotification(
CheerfulNotification::bulkDelete()
),
ForceDeleteBulkAction::make() ForceDeleteBulkAction::make()
->modalHeading("Hapus {$entity} yang dipilih"), ->modalHeading("Hapus {$entity} yang dipilih")
->successNotification(
CheerfulNotification::bulkForceDelete()
),
RestoreBulkAction::make() RestoreBulkAction::make()
->modalHeading("Pulihkan {$entity} yang dipilih"), ->modalHeading("Pulihkan {$entity} yang dipilih")
->successNotification(
CheerfulNotification::bulkRestore()
),
]; ];
} }
} }

View File

@ -4,6 +4,7 @@
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Resources\Manage\Contacts\Pages\ManageContacts; use App\Filament\Resources\Manage\Contacts\Pages\ManageContacts;
use App\Filament\Support\CheerfulNotification;
use App\Mail\ContactReplyMail; use App\Mail\ContactReplyMail;
use App\Models\Contact; use App\Models\Contact;
use BackedEnum; use BackedEnum;
@ -13,7 +14,6 @@
use Filament\Actions\ViewAction; use Filament\Actions\ViewAction;
use Filament\Forms\Components\Textarea; use Filament\Forms\Components\Textarea;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Notifications\Notification;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Components\Grid; use Filament\Schemas\Components\Grid;
use Filament\Schemas\Components\Section; use Filament\Schemas\Components\Section;
@ -22,6 +22,7 @@
use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
use UnitEnum; use UnitEnum;
@ -169,13 +170,13 @@ public static function table(Table $table): Table
$record->update([ $record->update([
'reply_message' => $data['reply_message'], 'reply_message' => $data['reply_message'],
'replied_at' => now(), 'replied_at' => now(),
'replied_by' => auth()->id(), 'replied_by' => Auth::id(),
]); ]);
Notification::make() CheerfulNotification::success(
->title('Balasan terkirim') 'Balasan Terkirim! 🚀✉️',
->success() 'Pesan balasan Anda sudah meluncur ke email pengirim. Semoga membantu mereka ya! 😊'
->send(); )->send();
}) })
->visible(fn (Contact $record): bool => $record->replied_at === null), ->visible(fn (Contact $record): bool => $record->replied_at === null),

View File

@ -4,13 +4,14 @@
use App\Enums\ApprovalStatus; use App\Enums\ApprovalStatus;
use App\Filament\Resources\Manage\Cooperations\CooperationResource; use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation; use App\Models\Cooperation;
use App\Models\User; use App\Models\User;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
class AcceptAction extends Action class AcceptAction extends Action
{ {
@ -25,7 +26,7 @@ protected function setUp(): void
$cooperationMedia = $record->cooperationMedia() $cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function (Builder $query): void { ->whereHas('partnerMedia', function (Builder $query): void {
$query->whereHas('company', function (Builder $subQuery): void { $query->whereHas('company', function (Builder $subQuery): void {
$subQuery->where('user_id', auth()->id()); $subQuery->where('user_id', Auth::id());
}); });
}) })
->first(); ->first();
@ -33,11 +34,10 @@ protected function setUp(): void
if ($cooperationMedia) { if ($cooperationMedia) {
$cooperationMedia->update(['status' => ApprovalStatus::ACCEPTED]); $cooperationMedia->update(['status' => ApprovalStatus::ACCEPTED]);
Notification::make() CheerfulNotification::success(
->title('Berhasil Diterima! ✅✨') 'Berhasil Diterima! ✅✨',
->body('Mantap! Anda telah menerima penawaran kerja sama ini. Silakan lanjut ke tahap pengajuan proposal ya! 💪') 'Mantap! Anda telah menerima penawaran kerja sama ini. Silakan lanjut ke tahap pengajuan proposal ya! 💪'
->success() )->send();
->send();
// Notify Admins // Notify Admins
User::superAdmin() User::superAdmin()
@ -56,7 +56,8 @@ protected function setUp(): void
} }
}) })
->visible(function (Cooperation $record): bool { ->visible(function (Cooperation $record): bool {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
if (! $user || ! $user->hasRole('Perusahaan')) { if (! $user || ! $user->hasRole('Perusahaan')) {
return false; return false;
@ -65,7 +66,7 @@ protected function setUp(): void
$cooperationMedia = $record->cooperationMedia() $cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function (Builder $query): void { ->whereHas('partnerMedia', function (Builder $query): void {
$query->whereHas('company', function (Builder $subQuery): void { $query->whereHas('company', function (Builder $subQuery): void {
$subQuery->where('user_id', auth()->id()); $subQuery->where('user_id', Auth::id());
}); });
}) })
->first(); ->first();

View File

@ -5,15 +5,16 @@
use App\Enums\ApprovalStatus; use App\Enums\ApprovalStatus;
use App\Enums\CooperationStatus; use App\Enums\CooperationStatus;
use App\Filament\Resources\Manage\Cooperations\CooperationResource; use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation; use App\Models\Cooperation;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Textarea; use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Illuminate\Support\Facades\Auth;
class CreateTaskAssignmentAction extends Action class CreateTaskAssignmentAction extends Action
{ {
@ -94,16 +95,16 @@ protected function setUp(): void
} }
} }
Notification::make() CheerfulNotification::success(
->title('Penugasan Berhasil Dibuat! 🚀✨') 'Penugasan Berhasil Dibuat! 🚀✨',
->body('Mantap! Penugasan telah dibuat dan semua media terkait sudah diberi tahu. Mari kita pantau progresnya! 💪') 'Mantap! Penugasan telah dibuat dan semua media terkait sudah diberi tahu. Mari kita pantau progresnya! 💪'
->success() )->send();
->send();
}) })
->modalHeading('Buat Penugasan') ->modalHeading('Buat Penugasan')
->modalSubmitActionLabel('Simpan') ->modalSubmitActionLabel('Simpan')
->visible(function (Cooperation $record): bool { ->visible(function (Cooperation $record): bool {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
return $user && ! $user->hasRole('Perusahaan') return $user && ! $user->hasRole('Perusahaan')
&& ! $record->taskAssignments()->exists() && ! $record->taskAssignments()->exists()

View File

@ -3,12 +3,13 @@
namespace App\Filament\Resources\Manage\Cooperations\Actions\Cooperation; namespace App\Filament\Resources\Manage\Cooperations\Actions\Cooperation;
use App\Enums\ApprovalStatus; use App\Enums\ApprovalStatus;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation; use App\Models\Cooperation;
use App\Models\User; use App\Models\User;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Illuminate\Support\Facades\Auth;
class RejectAction extends Action class RejectAction extends Action
{ {
@ -23,7 +24,7 @@ protected function setUp(): void
$cooperationMedia = $record->cooperationMedia() $cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function ($query) { ->whereHas('partnerMedia', function ($query) {
$query->whereHas('company', function ($subQuery) { $query->whereHas('company', function ($subQuery) {
$subQuery->where('user_id', auth()->id()); $subQuery->where('user_id', Auth::id());
}); });
}) })
->first(); ->first();
@ -31,11 +32,10 @@ protected function setUp(): void
if ($cooperationMedia) { if ($cooperationMedia) {
$cooperationMedia->update(['status' => ApprovalStatus::REJECTED]); $cooperationMedia->update(['status' => ApprovalStatus::REJECTED]);
Notification::make() CheerfulNotification::info(
->title('Berhasil Ditolak 🙏') 'Berhasil Ditolak 🙏',
->body('Terima kasih atas konfirmasinya. Pesan penolakan telah diteruskan ke Admin. 😊') 'Terima kasih atas konfirmasinya. Pesan penolakan telah diteruskan ke Admin. 😊'
->info() )->send();
->send();
// Notify Admins // Notify Admins
User::superAdmin() User::superAdmin()
@ -49,16 +49,17 @@ protected function setUp(): void
} }
}) })
->visible(function (Cooperation $record): bool { ->visible(function (Cooperation $record): bool {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
if (! $user->hasRole('Perusahaan')) { if (! $user || ! $user->hasRole('Perusahaan')) {
return false; return false;
} }
$cooperationMedia = $record->cooperationMedia() $cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function ($query) { ->whereHas('partnerMedia', function ($query) {
$query->whereHas('company', function ($subQuery) { $query->whereHas('company', function ($subQuery) {
$subQuery->where('user_id', auth()->id()); $subQuery->where('user_id', Auth::id());
}); });
}) })
->first(); ->first();

View File

@ -4,6 +4,7 @@
use App\Enums\ApprovalStatus; use App\Enums\ApprovalStatus;
use App\Filament\Resources\Manage\Cooperations\CooperationResource; use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation; use App\Models\Cooperation;
use App\Models\User; use App\Models\User;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
@ -11,10 +12,10 @@
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Forms\Components\Textarea; use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
class SendProposalAction extends Action class SendProposalAction extends Action
@ -54,7 +55,7 @@ protected function setUp(): void
$cooperationMedia = $record->cooperationMedia() $cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function (Builder $query): void { ->whereHas('partnerMedia', function (Builder $query): void {
$query->whereHas('company', function (Builder $subQuery): void { $query->whereHas('company', function (Builder $subQuery): void {
$subQuery->where('user_id', auth()->id()); $subQuery->where('user_id', Auth::id());
}); });
}) })
->first(); ->first();
@ -89,17 +90,17 @@ protected function setUp(): void
} }
} }
Notification::make() CheerfulNotification::success(
->title('Berhasil Diajukan! 🚀') 'Berhasil Diajukan! 🚀',
->body('Yeay! Proposal kerja sama Anda sudah terkirim ke Admin. Mohon ditunggu ya, semoga hasilnya memuaskan! ✨') 'Yeay! Proposal kerja sama Anda sudah terkirim ke Admin. Mohon ditunggu ya, semoga hasilnya memuaskan! ✨'
->success() )->send();
->send();
// Notify Admin // Notify Admin
User::superAdmin() User::superAdmin()
->get() ->get()
->each(function ($admin) use ($isRevision, $record, $cooperationMedia): void { ->each(function ($admin) use ($isRevision, $record, $cooperationMedia): void {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
$admin->notify(new BroadcastNotification([ $admin->notify(new BroadcastNotification([
'title' => $isRevision ? 'Pembaruan Proposal Kerja Sama ✨' : 'Ada Proposal Kerja Sama Baru! 🚀', 'title' => $isRevision ? 'Pembaruan Proposal Kerja Sama ✨' : 'Ada Proposal Kerja Sama Baru! 🚀',
'body' => $isRevision 'body' => $isRevision
@ -117,7 +118,8 @@ protected function setUp(): void
->modalHeading('Proposal Kerja Sama') ->modalHeading('Proposal Kerja Sama')
->modalSubmitActionLabel('Kirim Proposal') ->modalSubmitActionLabel('Kirim Proposal')
->visible(function (Cooperation $record): bool { ->visible(function (Cooperation $record): bool {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
if (! $user->hasRole('Perusahaan')) { if (! $user->hasRole('Perusahaan')) {
return false; return false;
@ -126,7 +128,7 @@ protected function setUp(): void
$cooperationMedia = $record->cooperationMedia() $cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function (Builder $query): void { ->whereHas('partnerMedia', function (Builder $query): void {
$query->whereHas('company', function (Builder $subQuery): void { $query->whereHas('company', function (Builder $subQuery): void {
$subQuery->where('user_id', auth()->id()); $subQuery->where('user_id', Auth::id());
}); });
}) })
->first(); ->first();

View File

@ -3,8 +3,10 @@
namespace App\Filament\Resources\Manage\Cooperations\Pages; namespace App\Filament\Resources\Manage\Cooperations\Pages;
use App\Filament\Resources\Manage\Cooperations\CooperationResource; use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Filament\Support\CheerfulNotification;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@ -25,6 +27,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getCreatedNotification(): ?Notification
{
return CheerfulNotification::create();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -3,8 +3,10 @@
namespace App\Filament\Resources\Manage\Cooperations\Pages; namespace App\Filament\Resources\Manage\Cooperations\Pages;
use App\Filament\Resources\Manage\Cooperations\CooperationResource; use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation; use App\Models\Cooperation;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@ -42,6 +44,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getSavedNotification(): ?Notification
{
return CheerfulNotification::update();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -10,6 +10,7 @@
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\ViewAction; use Filament\Actions\ViewAction;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Components\Grid; use Filament\Schemas\Components\Grid;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
@ -71,7 +72,13 @@ public function table(Table $table): Table
]) ])
->toolbarActions([ ->toolbarActions([
BulkActionGroup::make([ BulkActionGroup::make([
DeleteBulkAction::make(), DeleteBulkAction::make()
->successNotification(
Notification::make()
->title('Proposal Dihapus! 🗑️')
->body('Semua proposal yang dipilih telah berhasil dihapus. 👋')
->success()
),
]), ]),
]); ]);
} }

View File

@ -6,6 +6,7 @@
use App\Filament\Resources\Manage\Cooperations\Actions\Report\AcceptAction; use App\Filament\Resources\Manage\Cooperations\Actions\Report\AcceptAction;
use App\Filament\Resources\Manage\Cooperations\Actions\Report\RejectAction; use App\Filament\Resources\Manage\Cooperations\Actions\Report\RejectAction;
use App\Filament\Resources\Manage\Cooperations\CooperationResource; use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Filament\Support\CheerfulNotification;
use App\Models\Report; use App\Models\Report;
use App\Models\User; use App\Models\User;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
@ -15,13 +16,13 @@
use Filament\Forms\Components\SpatieMediaLibraryFileUpload; use Filament\Forms\Components\SpatieMediaLibraryFileUpload;
use Filament\Forms\Components\Textarea; use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
class ReportRelationManager extends RelationManager class ReportRelationManager extends RelationManager
{ {
@ -127,17 +128,17 @@ public function table(Table $table): Table
return $data; return $data;
}) })
->after(function (Report $record): void { ->after(function (Report $record): void {
Notification::make() CheerfulNotification::success(
->title('Laporan Berhasil Terkirim! 🚀✨') 'Laporan Berhasil Terkirim! 🚀✨',
->body('Hore! Laporan Anda sudah masuk ke sistem. Admin akan segera memeriksanya. Terima kasih atas kerja kerasnya! 💪') 'Hore! Laporan Anda sudah masuk ke sistem. Admin akan segera memeriksanya. Terima kasih atas kerja kerasnya! 💪'
->success() )->send();
->send();
// Notify Admins // Notify Admins
User::superAdmin() User::superAdmin()
->get() ->get()
->each(function ($admin) use ($record): void { ->each(function ($admin) use ($record): void {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
$admin->notify(new BroadcastNotification([ $admin->notify(new BroadcastNotification([
'title' => 'Ada Laporan Baru! 📝✨', 'title' => 'Ada Laporan Baru! 📝✨',
'body' => "Halo Admin! {$user->name} baru saja mengirimkan laporan \"{$record->title}\" untuk kerja sama \"{$this->getOwnerRecord()->title}\". Yuk, dicek! 😊", 'body' => "Halo Admin! {$user->name} baru saja mengirimkan laporan \"{$record->title}\" untuk kerja sama \"{$this->getOwnerRecord()->title}\". Yuk, dicek! 😊",
@ -150,7 +151,8 @@ public function table(Table $table): Table
}); });
}) })
->visible(function (): bool { ->visible(function (): bool {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
if (! $user || ! $user->hasRole('Perusahaan')) { if (! $user || ! $user->hasRole('Perusahaan')) {
return false; return false;

View File

@ -12,6 +12,7 @@
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea; use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
@ -107,16 +108,40 @@ public function table(Table $table): Table
$cooperation = $this->getOwnerRecord(); $cooperation = $this->getOwnerRecord();
return $cooperation->proposals()->accepted()->exists(); return $cooperation->proposals()->accepted()->exists();
}), })
->successNotification(
Notification::make()
->title('Penugasan Dibuat! 🚀✨')
->body('Tugas baru berhasil ditetapkan. Media terkait akan segera mengetahuinya! 💪')
->success()
),
]) ])
->recordActions([ ->recordActions([
EditAction::make(), EditAction::make()
->successNotification(
Notification::make()
->title('Penugasan Diperbarui! ✅')
->body('Perubahan pada penugasan berhasil disimpan. 👍')
->success()
),
DeleteAction::make(), DeleteAction::make()
->successNotification(
Notification::make()
->title('Penugasan Dihapus! 🗑️')
->body('Penugasan telah berhasil dihapus dari sistem. 👋')
->success()
),
]) ])
->toolbarActions([ ->toolbarActions([
BulkActionGroup::make([ BulkActionGroup::make([
DeleteBulkAction::make(), DeleteBulkAction::make()
->successNotification(
Notification::make()
->title('Banyak Penugasan Dihapus! 🗑️👋')
->body('Semua penugasan yang dipilih telah dihapus. 🧹')
->success()
),
]), ]),
]); ]);
} }

View File

@ -3,7 +3,9 @@
namespace App\Filament\Resources\Manage\Journalists\Actions; namespace App\Filament\Resources\Manage\Journalists\Actions;
use App\Enums\VerificationStatus; use App\Enums\VerificationStatus;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Illuminate\Support\Facades\Auth;
class DeleteJournalistAction extends DeleteAction class DeleteJournalistAction extends DeleteAction
{ {
@ -11,8 +13,13 @@ protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
$this->successNotification(
CheerfulNotification::delete()
);
$this->visible(function (): bool { $this->visible(function (): bool {
$user = auth()->user(); /** @var \App\Models\User $user */
$user = Auth::user();
if (! $user->hasRole('Perusahaan')) { if (! $user->hasRole('Perusahaan')) {
return true; return true;

View File

@ -3,10 +3,12 @@
namespace App\Filament\Resources\Manage\Journalists\Actions; namespace App\Filament\Resources\Manage\Journalists\Actions;
use App\Enums\VerificationStatus; use App\Enums\VerificationStatus;
use App\Filament\Support\CheerfulNotification;
use App\Models\Journalist; use App\Models\Journalist;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
class EditJournalistAction extends EditAction class EditJournalistAction extends EditAction
@ -15,6 +17,10 @@ protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
$this->successNotification(
CheerfulNotification::update()
);
$this->modalWidth(Width::Large) $this->modalWidth(Width::Large)
->fillForm(function (Journalist $journalist): array { ->fillForm(function (Journalist $journalist): array {
$data = [ $data = [
@ -89,7 +95,7 @@ protected function setUp(): void
}) })
->visible(function (): bool { ->visible(function (): bool {
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = Auth::user();
if (! $user->hasRole('Perusahaan')) { if (! $user->hasRole('Perusahaan')) {
return true; return true;

View File

@ -2,6 +2,8 @@
namespace App\Filament\Resources\Manage\Journalists; namespace App\Filament\Resources\Manage\Journalists;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Pages\Media; use App\Filament\Pages\Media;
use App\Filament\Resources\Manage\Journalists\Actions\DeleteJournalistAction; use App\Filament\Resources\Manage\Journalists\Actions\DeleteJournalistAction;
@ -13,9 +15,7 @@
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\ForceDeleteBulkAction; use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreAction;
use Filament\Actions\RestoreBulkAction; use Filament\Actions\RestoreBulkAction;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Manage\Journalists\Pages; namespace App\Filament\Resources\Manage\Journalists\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Manage\Journalists\JournalistResource; use App\Filament\Resources\Manage\Journalists\JournalistResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;

View File

@ -2,14 +2,12 @@
namespace App\Filament\Resources\Manage\Partners; namespace App\Filament\Resources\Manage\Partners;
use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Resources\Manage\Partners\Pages\ManagePartners; use App\Filament\Resources\Manage\Partners\Pages\ManagePartners;
use App\Filament\Resources\Manage\Partners\Pages\ViewPartner; use App\Filament\Resources\Manage\Partners\Pages\ViewPartner;
use App\Models\User; use App\Models\User;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Actions\ViewAction; use Filament\Actions\ViewAction;
use Filament\Infolists\Components\RepeatableEntry; use Filament\Infolists\Components\RepeatableEntry;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
@ -315,11 +313,7 @@ public static function table(Table $table): Table
]) ])
->toolbarActions([ ->toolbarActions([
BulkActionGroup::make([ BulkActionGroup::make([
DeleteBulkAction::make(), ...DefaultBulkActions::make('rekanan'),
ForceDeleteBulkAction::make(),
RestoreBulkAction::make(),
]), ]),
]) ])
->emptyStateIcon(Heroicon::BuildingOffice2) ->emptyStateIcon(Heroicon::BuildingOffice2)

View File

@ -3,17 +3,15 @@
namespace App\Filament\Resources\Master\Categories; namespace App\Filament\Resources\Master\Categories;
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\Categories\Pages\ManageCategories; use App\Filament\Resources\Master\Categories\Pages\ManageCategories;
use App\Filament\Support\CheerfulNotification;
use App\Models\Category; use App\Models\Category;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
@ -74,6 +72,8 @@ public static function table(Table $table): Table
->updateStateUsing(function (Category $record, bool $state): void { ->updateStateUsing(function (Category $record, bool $state): void {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
CheerfulNotification::statusUpdated()->send();
}), }),
...TimestampColumns::make(), ...TimestampColumns::make(),

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\Categories\Pages; namespace App\Filament\Resources\Master\Categories\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\Categories\CategoryResource; use App\Filament\Resources\Master\Categories\CategoryResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -3,16 +3,17 @@
namespace App\Filament\Resources\Master\Classifications; namespace App\Filament\Resources\Master\Classifications;
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\Classifications\Pages\ManageClassifications; use App\Filament\Resources\Master\Classifications\Pages\ManageClassifications;
use App\Filament\Support\CheerfulNotification;
use App\Models\Classification; use App\Models\Classification;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
@ -74,6 +75,8 @@ public static function table(Table $table): Table
->updateStateUsing(function (Classification $record, bool $state): void { ->updateStateUsing(function (Classification $record, bool $state): void {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
CheerfulNotification::statusUpdated()->send();
}), }),
...TimestampColumns::make(), ...TimestampColumns::make(),

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\Classifications\Pages; namespace App\Filament\Resources\Master\Classifications\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\Classifications\ClassificationResource; use App\Filament\Resources\Master\Classifications\ClassificationResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -3,16 +3,17 @@
namespace App\Filament\Resources\Master\Departments; namespace App\Filament\Resources\Master\Departments;
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\Departments\Pages\ManageDepartments; use App\Filament\Resources\Master\Departments\Pages\ManageDepartments;
use App\Filament\Support\CheerfulNotification;
use App\Models\Department; use App\Models\Department;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
@ -84,6 +85,8 @@ public static function table(Table $table): Table
->updateStateUsing(function (Department $record, bool $state): void { ->updateStateUsing(function (Department $record, bool $state): void {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
CheerfulNotification::statusUpdated()->send();
}), }),
...TimestampColumns::make(), ...TimestampColumns::make(),

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\Departments\Pages; namespace App\Filament\Resources\Master\Departments\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\Departments\DepartmentResource; use App\Filament\Resources\Master\Departments\DepartmentResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -3,16 +3,17 @@
namespace App\Filament\Resources\Master\Locations; namespace App\Filament\Resources\Master\Locations;
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\Locations\Pages\ManageLocations; use App\Filament\Resources\Master\Locations\Pages\ManageLocations;
use App\Filament\Support\CheerfulNotification;
use App\Models\Location; use App\Models\Location;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
@ -74,6 +75,8 @@ public static function table(Table $table): Table
->updateStateUsing(function (Location $record, bool $state): void { ->updateStateUsing(function (Location $record, bool $state): void {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
CheerfulNotification::statusUpdated()->send();
}), }),
...TimestampColumns::make(), ...TimestampColumns::make(),

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\Locations\Pages; namespace App\Filament\Resources\Master\Locations\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\Locations\LocationResource; use App\Filament\Resources\Master\Locations\LocationResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\SubClassifications\Pages; namespace App\Filament\Resources\Master\SubClassifications\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\SubClassifications\SubClassificationResource; use App\Filament\Resources\Master\SubClassifications\SubClassificationResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -3,6 +3,10 @@
namespace App\Filament\Resources\Master\SubClassifications; namespace App\Filament\Resources\Master\SubClassifications;
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\SubClassifications\Pages\ManageSubClassifications; use App\Filament\Resources\Master\SubClassifications\Pages\ManageSubClassifications;
@ -10,12 +14,9 @@
use App\Models\SubClassification; use App\Models\SubClassification;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
@ -90,6 +91,12 @@ public static function table(Table $table): Table
->updateStateUsing(function (SubClassification $record, bool $state): void { ->updateStateUsing(function (SubClassification $record, bool $state): void {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
Notification::make()
->title('Status Berubah! 🔄✨')
->body('Status data berhasil diperbarui. Perubahan langsung aktif ya! 👍')
->success()
->send();
}), }),
...TimestampColumns::make(), ...TimestampColumns::make(),

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\SubLocations\Pages; namespace App\Filament\Resources\Master\SubLocations\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\SubLocations\SubLocationResource; use App\Filament\Resources\Master\SubLocations\SubLocationResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -3,17 +3,18 @@
namespace App\Filament\Resources\Master\SubLocations; namespace App\Filament\Resources\Master\SubLocations;
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\SubLocations\Pages\ManageSubLocations; use App\Filament\Resources\Master\SubLocations\Pages\ManageSubLocations;
use App\Filament\Support\CheerfulNotification;
use App\Models\Location; use App\Models\Location;
use App\Models\SubLocation; use App\Models\SubLocation;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
@ -90,6 +91,8 @@ public static function table(Table $table): Table
->updateStateUsing(function (SubLocation $record, bool $state): void { ->updateStateUsing(function (SubLocation $record, bool $state): void {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
CheerfulNotification::statusUpdated()->send();
}), }),
...TimestampColumns::make(), ...TimestampColumns::make(),

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\Themes\Pages; namespace App\Filament\Resources\Master\Themes\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\Themes\ThemeResource; use App\Filament\Resources\Master\Themes\ThemeResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -3,16 +3,17 @@
namespace App\Filament\Resources\Master\Themes; namespace App\Filament\Resources\Master\Themes;
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\Themes\Pages\ManageThemes; use App\Filament\Resources\Master\Themes\Pages\ManageThemes;
use App\Filament\Support\CheerfulNotification;
use App\Models\Theme; use App\Models\Theme;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
@ -74,6 +75,8 @@ public static function table(Table $table): Table
->updateStateUsing(function (Theme $record, bool $state): void { ->updateStateUsing(function (Theme $record, bool $state): void {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
CheerfulNotification::statusUpdated()->send();
}), }),
...TimestampColumns::make(), ...TimestampColumns::make(),

View File

@ -2,8 +2,8 @@
namespace App\Filament\Resources\Master\Users\Pages; namespace App\Filament\Resources\Master\Users\Pages;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Master\Users\UserResource; use App\Filament\Resources\Master\Users\UserResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -4,19 +4,20 @@
use App\Enums\IsActive; use App\Enums\IsActive;
use App\Enums\RoleEnum; use App\Enums\RoleEnum;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Master\Users\Pages\ManageUsers; use App\Filament\Resources\Master\Users\Pages\ManageUsers;
use App\Models\User; use App\Models\User;
use BackedEnum; use BackedEnum;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\Hidden; use Filament\Forms\Components\Hidden;
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
@ -127,6 +128,12 @@ public static function table(Table $table): Table
->where('user_id', $record->id) ->where('user_id', $record->id)
->delete(); ->delete();
} }
Notification::make()
->title($state ? 'Pengguna Diaktifkan! ✅' : 'Pengguna Dinonaktifkan ⛔')
->body($state ? 'Status akun pengguna berhasil diaktifkan kembali. Siap beraksi! 🚀' : 'Status akun pengguna berhasil dinonaktifkan. Istirahat dulu ya... 😴')
->success()
->send();
}) })
->disabled(fn (User $record): bool => $record->hasRole(RoleEnum::PERUSAHAAN->value)), ->disabled(fn (User $record): bool => $record->hasRole(RoleEnum::PERUSAHAAN->value)),

View File

@ -3,7 +3,9 @@
namespace App\Filament\Resources\Monitoring\ContentRecaps\Pages; namespace App\Filament\Resources\Monitoring\ContentRecaps\Pages;
use App\Filament\Resources\Monitoring\ContentRecaps\ContentRecapResource; use App\Filament\Resources\Monitoring\ContentRecaps\ContentRecapResource;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
class CreateContentRecap extends CreateRecord class CreateContentRecap extends CreateRecord
@ -23,6 +25,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getCreatedNotification(): ?Notification
{
return CheerfulNotification::create();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -4,7 +4,9 @@
use App\Filament\Resources\Monitoring\ContentRecaps\ContentRecapResource; use App\Filament\Resources\Monitoring\ContentRecaps\ContentRecapResource;
use App\Filament\Resources\Monitoring\MediaMonitorings\Pages\ListMediaMonitorings; use App\Filament\Resources\Monitoring\MediaMonitorings\Pages\ListMediaMonitorings;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
class EditContentRecap extends EditRecord class EditContentRecap extends EditRecord
@ -22,6 +24,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getSavedNotification(): ?Notification
{
return CheerfulNotification::update();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -2,13 +2,13 @@
namespace App\Filament\Resources\Monitoring\ContentRecaps\Tables; namespace App\Filament\Resources\Monitoring\ContentRecaps\Tables;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter; use Filament\Tables\Filters\TrashedFilter;

View File

@ -3,7 +3,9 @@
namespace App\Filament\Resources\Monitoring\IssueManagements\Pages; namespace App\Filament\Resources\Monitoring\IssueManagements\Pages;
use App\Filament\Resources\Monitoring\IssueManagements\IssueManagementResource; use App\Filament\Resources\Monitoring\IssueManagements\IssueManagementResource;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
class CreateIssueManagement extends CreateRecord class CreateIssueManagement extends CreateRecord
@ -23,6 +25,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getCreatedNotification(): ?Notification
{
return CheerfulNotification::create();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -3,7 +3,9 @@
namespace App\Filament\Resources\Monitoring\IssueManagements\Pages; namespace App\Filament\Resources\Monitoring\IssueManagements\Pages;
use App\Filament\Resources\Monitoring\IssueManagements\IssueManagementResource; use App\Filament\Resources\Monitoring\IssueManagements\IssueManagementResource;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
class EditIssueManagement extends EditRecord class EditIssueManagement extends EditRecord
@ -21,6 +23,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getSavedNotification(): ?Notification
{
return CheerfulNotification::update();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -2,13 +2,13 @@
namespace App\Filament\Resources\Monitoring\IssueManagements\Tables; namespace App\Filament\Resources\Monitoring\IssueManagements\Tables;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Filters\SelectFilter;

View File

@ -2,12 +2,12 @@
namespace App\Filament\Resources\Monitoring\MediaMonitorings\Actions; namespace App\Filament\Resources\Monitoring\MediaMonitorings\Actions;
use App\Filament\Support\CheerfulNotification;
use App\Models\Theme; use App\Models\Theme;
use App\Services\NewsCrawlerService; use App\Services\NewsCrawlerService;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
@ -48,17 +48,15 @@ protected function setUp(): void
$count = $service->crawlFromGoogleNews($data['keyword'], $data['limit'], (array) ($data['theme_id'] ?? [])); $count = $service->crawlFromGoogleNews($data['keyword'], $data['limit'], (array) ($data['theme_id'] ?? []));
if ($count > 0) { if ($count > 0) {
Notification::make() CheerfulNotification::success(
->title('Crawl Selesai') 'Crawl Berhasil! 🕸️🚀',
->body("Berhasil mengambil {$count} berita baru tentang '{$data['keyword']}' di Purwakarta.") "Mantap! Ada {$count} berita baru nih tentang '{$data['keyword']}' di Purwakarta. Databasenya makin kaya! 😎"
->success() )->send();
->send();
} else { } else {
Notification::make() CheerfulNotification::info(
->title('Tidak Ada Berita Baru') 'Belum Ada Berita Baru 🔍',
->body("Tidak ditemukan berita baru untuk '{$data['keyword']}' yang belum ada di database.") "Hmm, sepertinya belum ada update berita baru untuk '{$data['keyword']}'. Coba lagi nanti ya! 😉"
->info() )->send();
->send();
} }
}) })
->modalWidth(Width::Large); ->modalWidth(Width::Large);

View File

@ -3,8 +3,10 @@
namespace App\Filament\Resources\Monitoring\MediaMonitorings\Pages; namespace App\Filament\Resources\Monitoring\MediaMonitorings\Pages;
use App\Filament\Resources\Monitoring\MediaMonitorings\MediaMonitoringResource; use App\Filament\Resources\Monitoring\MediaMonitorings\MediaMonitoringResource;
use App\Filament\Support\CheerfulNotification;
use App\Models\MediaMonitoring; use App\Models\MediaMonitoring;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
class CreateMediaMonitoring extends CreateRecord class CreateMediaMonitoring extends CreateRecord
@ -24,6 +26,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getCreatedNotification(): ?Notification
{
return CheerfulNotification::create();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -3,7 +3,9 @@
namespace App\Filament\Resources\Monitoring\MediaMonitorings\Pages; namespace App\Filament\Resources\Monitoring\MediaMonitorings\Pages;
use App\Filament\Resources\Monitoring\MediaMonitorings\MediaMonitoringResource; use App\Filament\Resources\Monitoring\MediaMonitorings\MediaMonitoringResource;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
class EditMediaMonitoring extends EditRecord class EditMediaMonitoring extends EditRecord
@ -21,6 +23,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getSavedNotification(): ?Notification
{
return CheerfulNotification::update();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -2,14 +2,14 @@
namespace App\Filament\Resources\Monitoring\MediaMonitorings\Tables; namespace App\Filament\Resources\Monitoring\MediaMonitorings\Tables;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Monitoring\MediaMonitorings\Actions\CrawlNewsAction; use App\Filament\Resources\Monitoring\MediaMonitorings\Actions\CrawlNewsAction;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter; use Filament\Tables\Filters\TrashedFilter;

View File

@ -3,6 +3,10 @@
namespace App\Filament\Resources\Publication\Announcements; namespace App\Filament\Resources\Publication\Announcements;
use App\Enums\AnnouncementType; use App\Enums\AnnouncementType;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use App\Filament\Resources\Publication\Announcements\Pages\ManageAnnouncements; use App\Filament\Resources\Publication\Announcements\Pages\ManageAnnouncements;
@ -10,10 +14,6 @@
use BackedEnum; use BackedEnum;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Forms\Components\CheckboxList; use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Radio; use Filament\Forms\Components\Radio;
use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\RichEditor;

View File

@ -3,12 +3,12 @@
namespace App\Filament\Resources\Publication\Announcements\Pages; namespace App\Filament\Resources\Publication\Announcements\Pages;
use App\Enums\AnnouncementType; use App\Enums\AnnouncementType;
use App\Filament\Actions\Cheerful\CreateAction;
use App\Filament\Resources\Publication\Announcements\AnnouncementResource; use App\Filament\Resources\Publication\Announcements\AnnouncementResource;
use App\Models\Company; use App\Models\Company;
use App\Models\PartnerMedia; use App\Models\PartnerMedia;
use App\Models\User; use App\Models\User;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords; use Filament\Resources\Pages\ManageRecords;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;

View File

@ -3,9 +3,12 @@
namespace App\Filament\Resources\Publication\News\Pages; namespace App\Filament\Resources\Publication\News\Pages;
use App\Filament\Resources\Publication\News\NewsResource; use App\Filament\Resources\Publication\News\NewsResource;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
class CreateNews extends CreateRecord class CreateNews extends CreateRecord
{ {
@ -24,6 +27,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getCreatedNotification(): ?Notification
{
return CheerfulNotification::create();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');
@ -31,7 +39,7 @@ protected function getRedirectUrl(): string
protected function handleRecordCreation(array $data): Model protected function handleRecordCreation(array $data): Model
{ {
$data['author_id'] = auth()->id(); $data['author_id'] = Auth::id();
return static::getModel()::create($data); return static::getModel()::create($data);
} }

View File

@ -3,7 +3,9 @@
namespace App\Filament\Resources\Publication\News\Pages; namespace App\Filament\Resources\Publication\News\Pages;
use App\Filament\Resources\Publication\News\NewsResource; use App\Filament\Resources\Publication\News\NewsResource;
use App\Filament\Support\CheerfulNotification;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
class EditNews extends EditRecord class EditNews extends EditRecord
@ -21,6 +23,11 @@ protected function getHeaderActions(): array
]; ];
} }
protected function getSavedNotification(): ?Notification
{
return CheerfulNotification::update();
}
protected function getRedirectUrl(): string protected function getRedirectUrl(): string
{ {
return $this->getResource()::getUrl('index'); return $this->getResource()::getUrl('index');

View File

@ -72,8 +72,7 @@ public static function configure(Schema $schema): Schema
$component->state( $component->state(
$record->tags->pluck('name')->toArray() $record->tags->pluck('name')->toArray()
); );
}) }),
->autocomplete(false),
Radio::make('status') Radio::make('status')
->label('Status') ->label('Status')

View File

@ -2,13 +2,13 @@
namespace App\Filament\Resources\Publication\News\Tables; namespace App\Filament\Resources\Publication\News\Tables;
use App\Filament\Actions\Cheerful\DeleteAction;
use App\Filament\Actions\Cheerful\EditAction;
use App\Filament\Actions\Cheerful\ForceDeleteAction;
use App\Filament\Actions\Cheerful\RestoreAction;
use App\Filament\Actions\DefaultBulkActions; use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\TimestampColumns; use App\Filament\Columns\TimestampColumns;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteAction;
use Filament\Actions\RestoreAction;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter; use Filament\Tables\Filters\TrashedFilter;

View File

@ -0,0 +1,159 @@
<?php
namespace App\Filament\Support;
use Filament\Notifications\Notification;
class CheerfulNotification
{
/**
* Create a new notification instance.
*/
public static function make(): Notification
{
return Notification::make();
}
/**
* Notification for successful record creation.
*/
public static function create(): Notification
{
return self::make()
->title('Hore! Data Tersimpan 🎉✨')
->body('Data baru berhasil ditambahkan! Sistem sudah menyimpannya dengan aman. 🚀💪')
->success();
}
/**
* Notification for successful record update.
*/
public static function update(): Notification
{
return self::make()
->title('Mantap! Data Diperbarui ✅🔥')
->body('Perubahan berhasil disimpan! Data sekarang sudah up-to-date dan segar lagi. ✨👌')
->success();
}
/**
* Notification for successful record deletion (soft delete).
*/
public static function delete(): Notification
{
return self::make()
->title('Oke, Data Dihapus 🗑️👋')
->body('Data tersebut sudah berhasil dihapus dari sistem. Semuanya bersih dan rapi sekarang! 😊🚮')
->success();
}
/**
* Notification for successful permanent deletion.
*/
public static function forceDelete(): Notification
{
return self::make()
->title('Selamat Tinggal Selamanya 👋😢')
->body('Data telah dihapus permanen dan tidak bisa kembali. Semoga ini keputusan yang tepat! 🚮💨')
->success();
}
/**
* Notification for successful record restoration.
*/
public static function restore(): Notification
{
return self::make()
->title('Welcome Back! Data Pulih ♻️✨')
->body('Data berhasil dikembalikan! Hati-hati ya, jangan sampai terhapus lagi. 😉👍')
->success();
}
/**
* Notification for successful status change/toggle.
*/
public static function statusUpdated(?string $title = null, ?string $body = null): Notification
{
return self::make()
->title($title ?? 'Status Berubah! 🔄✨')
->body($body ?? 'Status data berhasil diperbarui. Perubahan langsung aktif ya! 👍')
->success();
}
/**
* Notification for successful bulk deletion.
*/
public static function bulkDelete(): Notification
{
return self::make()
->title('Oke, Banyak Data Dihapus 🗑️👋')
->body('Semua data yang dipilih berhasil dihapus. Sistem makin lega deh! 😊')
->success();
}
/**
* Notification for successful bulk permanent deletion.
*/
public static function bulkForceDelete(): Notification
{
return self::make()
->title('Bye Bye Semua! 👋🔥')
->body('Data yang dipilih sudah dihapus permanen. Bersih total! 🧹💨')
->success();
}
/**
* Notification for successful bulk restoration.
*/
public static function bulkRestore(): Notification
{
return self::make()
->title('Hore! Banyak Data Pulih ♻️🎉')
->body('Data-data tersebut sudah kembali aktif. Selamat bekerja kembali! 💪✨')
->success();
}
/**
* Custom cheerful success notification.
*/
public static function success(string $title, string $body): Notification
{
return self::make()
->title($title)
->body($body)
->success();
}
/**
* Custom cheerful info notification.
*/
public static function info(string $title, string $body): Notification
{
return self::make()
->title($title)
->body($body)
->info();
}
/**
* Custom cheerful warning notification.
*/
public static function warning(string $title, string $body): Notification
{
return self::make()
->title($title)
->body($body)
->warning();
}
/**
* Custom cheerful danger notification.
*/
public static function danger(string $title, string $body): Notification
{
return self::make()
->title($title)
->body($body)
->danger();
}
}