refactor: Update modal headings and descriptions for clarity, enhance date formatting, and improve user notifications in verification processes.

This commit is contained in:
Yoga Pangestu 2026-01-19 09:40:46 +07:00
parent 87b0275151
commit 6574684f46
6 changed files with 24 additions and 33 deletions

View File

@ -5,6 +5,7 @@
use App\Enums\DecisionAdmin; use App\Enums\DecisionAdmin;
use App\Enums\VerificationStatus; use App\Enums\VerificationStatus;
use App\Filament\Resources\Manage\Partners\Pages\ViewPartner; use App\Filament\Resources\Manage\Partners\Pages\ViewPartner;
use App\Filament\Support\CheerfulNotification;
use App\Models\User; use App\Models\User;
use App\Models\VerificationRequest; use App\Models\VerificationRequest;
use App\Notifications\BroadcastNotification; use App\Notifications\BroadcastNotification;
@ -161,8 +162,8 @@ public function approveAction(): Action
->icon('heroicon-o-check') ->icon('heroicon-o-check')
->size('sm') ->size('sm')
->requiresConfirmation() ->requiresConfirmation()
->modalHeading('Setujui Verifikasi Lengkap') ->modalHeading('Setujui Verifikasi')
->modalDescription('Apakah Anda yakin ingin menyetujui verifikasi ini? Status akan diterapkan pada Perusahaan, Media, dan semua Jurnalis sekaligus.') ->modalDescription('Apakah Anda yakin ingin menyetujui verifikasi ini? Pastikan data sudah benar dan lengkap.')
->modalSubmitActionLabel('Ya, Setujui') ->modalSubmitActionLabel('Ya, Setujui')
->action(function (array $arguments, array $data): void { ->action(function (array $arguments, array $data): void {
$this->processReview($arguments['id'], DecisionAdmin::APPROVED, $data['note'] ?? null); $this->processReview($arguments['id'], DecisionAdmin::APPROVED, $data['note'] ?? null);
@ -180,13 +181,12 @@ public function revisionAction(): Action
->icon('heroicon-o-pencil-square') ->icon('heroicon-o-pencil-square')
->size('sm') ->size('sm')
->modalHeading('Minta Revisi') ->modalHeading('Minta Revisi')
->modalDescription('User akan diminta untuk memperbaiki data sesuai catatan yang diberikan.') ->modalDescription('Pengguna akan diminta untuk memperbaiki data sesuai catatan yang diberikan.')
->schema([ ->schema([
Textarea::make('note') Textarea::make('note')
->label('Catatan Revisi') ->label('Catatan Revisi')
->required() ->required()
->placeholder('Jelaskan bagian yang perlu diperbaiki (Perusahaan, Media, atau Jurnalis)...') ->placeholder('Jelaskan bagian yang perlu diperbaiki (Perusahaan, Media, atau Jurnalis)...')
->helperText('Catatan ini akan ditampilkan kepada user.')
->autocomplete(false) ->autocomplete(false)
->autofocus(), ->autofocus(),
]) ])
@ -206,15 +206,14 @@ public function rejectAction(): Action
->icon('heroicon-o-x-mark') ->icon('heroicon-o-x-mark')
->size('sm') ->size('sm')
->requiresConfirmation() ->requiresConfirmation()
->modalHeading('Tolak Verifikasi Lengkap') ->modalHeading('Tolak Verifikasi')
->modalDescription('Pengajuan akan ditolak secara permanen. Status REJECTED akan diterapkan pada Perusahaan, Media, dan semua Jurnalis. User tidak dapat mengajukan ulang untuk data ini.') ->modalDescription('Pengajuan akan ditolak secara permanen. Pengguna tidak dapat mengajukan ulang untuk data ini.')
->modalSubmitActionLabel('Ya, Tolak') ->modalSubmitActionLabel('Ya, Tolak')
->schema([ ->schema([
Textarea::make('note') Textarea::make('note')
->label('Alasan Penolakan') ->label('Alasan Penolakan')
->required() ->required()
->placeholder('Jelaskan alasan pengajuan ditolak...') ->placeholder('Jelaskan alasan pengajuan ditolak...')
->helperText('Alasan ini akan ditampilkan kepada user.')
->autocomplete(false) ->autocomplete(false)
->autofocus(), ->autofocus(),
]) ])
@ -249,16 +248,10 @@ protected function processReview(int $requestId, DecisionAdmin $decision, ?strin
DecisionAdmin::REJECTED => 'ditolak', DecisionAdmin::REJECTED => 'ditolak',
}; };
$color = match ($decision) { CheerfulNotification::success(
DecisionAdmin::APPROVED => 'success', 'Berhasil Diproses! ✨',
DecisionAdmin::NEED_REVISION => 'info', "Mantap! Verifikasi telah {$actionLabel} dan notifikasi sudah dikirim ke user. Kerja bagus, Admin! 💪"
DecisionAdmin::REJECTED => 'danger', )
};
Notification::make()
->title('Berhasil Diproses! ✨')
->body("Mantap! Verifikasi telah {$actionLabel} dan notifikasi sudah dikirim ke user. Kerja bagus, Admin! 💪")
->color($color)
->send(); ->send();
// Notify User // Notify User
@ -271,7 +264,7 @@ protected function processReview(int $requestId, DecisionAdmin $decision, ?strin
}; };
$body = match ($decision) { $body = match ($decision) {
DecisionAdmin::APPROVED => 'Yeay! Pengajuan verifikasi perusahaan Anda telah disetujui. Sekarang Anda sudah resmi terverifikasi! 🎊', DecisionAdmin::APPROVED => 'Yeay! Pengajuan verifikasi perusahaan Anda telah disetujui. Sekarang Anda sudah resmi terverifikasi dan bekerja sama dengan kami! 🎊',
DecisionAdmin::NEED_REVISION => 'Ayo sedikit lagi! Admin meminta beberapa perbaikan pada pengajuan Anda agar bisa segera disetujui. 💪', DecisionAdmin::NEED_REVISION => 'Ayo sedikit lagi! Admin meminta beberapa perbaikan pada pengajuan Anda agar bisa segera disetujui. 💪',
DecisionAdmin::REJECTED => 'Yah, maaf banget... pengajuan verifikasi perusahaan Anda belum bisa kami terima saat ini. 💔', DecisionAdmin::REJECTED => 'Yah, maaf banget... pengajuan verifikasi perusahaan Anda belum bisa kami terima saat ini. 💔',
}; };

View File

@ -77,7 +77,7 @@ public function getVerificationProgress(): array
// Add additional data for view // Add additional data for view
$progress['missingDataButtons'] = $this->verificationService->getMissingDataButtons($this->company); $progress['missingDataButtons'] = $this->verificationService->getMissingDataButtons($this->company);
$progress['alert'] = $this->verificationService->getAlertData($this->verificationRequest); $progress['alert'] = $this->verificationService->getAlertData($this->verificationRequest);
$progress['lastSubmittedAt'] = $this->verificationRequest?->updated_at?->format('d M Y, H:i'); $progress['lastSubmittedAt'] = $this->verificationRequest?->updated_at?->translatedFormat('l, d M Y H:i');
return $progress; return $progress;
} }
@ -96,13 +96,13 @@ public function submitVerificationAction(): Action
->icon('heroicon-o-paper-airplane') ->icon('heroicon-o-paper-airplane')
->color('primary') ->color('primary')
->requiresConfirmation() ->requiresConfirmation()
->modalHeading('Ajukan Verifikasi Lengkap') ->modalHeading('Ajukan Verifikasi')
->modalDescription(function () use ($progress): string { ->modalDescription(function () use ($progress): string {
if (! $progress['isDataComplete']) { if (! $progress['isDataComplete']) {
return 'Data belum lengkap. Silakan lengkapi terlebih dahulu: '.implode(', ', $progress['missingData']); return 'Data belum lengkap. Silakan lengkapi terlebih dahulu: '.implode(', ', $progress['missingData']);
} }
return 'Apakah Anda yakin ingin mengajukan verifikasi untuk Perusahaan, Media, dan Jurnalis? Pastikan semua data sudah benar dan lengkap.'; return 'Apakah Anda yakin ingin mengajukan verifikasi? Pastikan semua data sudah benar dan lengkap.';
}) })
->modalSubmitActionLabel('Ya, Ajukan') ->modalSubmitActionLabel('Ya, Ajukan')
->visible(fn (): bool => $progress['canSubmit']) ->visible(fn (): bool => $progress['canSubmit'])

View File

@ -335,7 +335,7 @@ public function getAlertData(?VerificationRequest $verificationRequest): ?array
'type' => 'approved', 'type' => 'approved',
'icon' => 'check-circle', 'icon' => 'check-circle',
'title' => 'Verifikasi Diterima', 'title' => 'Verifikasi Diterima',
'message' => 'Verifikasi lengkap Anda telah diterima dan disetujui oleh admin. Seluruh data (Perusahaan, Media, dan Jurnalis) telah terverifikasi.', 'message' => 'Verifikasi Anda telah diterima dan disetujui oleh admin. Sekarang Anda sudah resmi terverifikasi dan bekerja sama dengan kami!',
'color' => 'success', 'color' => 'success',
]; ];
} }

View File

@ -28,7 +28,7 @@ public function definition(): array
'email' => fake()->unique()->safeEmail(), 'email' => fake()->unique()->safeEmail(),
'username' => $this->faker->unique()->bothify('?????#####'), 'username' => $this->faker->unique()->bothify('?????#####'),
'email_verified_at' => now(), 'email_verified_at' => now(),
'password' => static::$password ??= Hash::make('password'), 'password' => static::$password ??= Hash::make(config('auth.password_default')),
'remember_token' => Str::random(10), 'remember_token' => Str::random(10),
]; ];
} }

View File

@ -113,9 +113,6 @@
title="{{ $card['companyName'] }}"> title="{{ $card['companyName'] }}">
{{ $card['companyName'] }} {{ $card['companyName'] }}
</h3> </h3>
<p class="text-sm text-gray-500 dark:text-gray-400 mt-1">
Perusahaan, Media & Jurnalis
</p>
</div> </div>
{{-- Status Badge --}} {{-- Status Badge --}}
@ -194,17 +191,18 @@ class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-500/20 flex items-c
<div> <div>
<p class="text-xs text-gray-500 dark:text-gray-400 uppercase font-semibold">Diajukan</p> <p class="text-xs text-gray-500 dark:text-gray-400 uppercase font-semibold">Diajukan</p>
<p class="text-gray-700 dark:text-gray-300"> <p class="text-gray-700 dark:text-gray-300">
{{ $verification->created_at->format('d M Y') }} {{ $verification->created_at->translatedFormat('l, d M Y H:i') }}
</p> </p>
<p class="text-xs text-gray-500"> <p class="text-xs text-gray-500">
{{ $verification->created_at->format('H:i') }} {{ $verification->created_at->diffForHumans() }}
</p> </p>
</div> </div>
<div> <div>
<p class="text-xs text-gray-500 dark:text-gray-400 uppercase font-semibold">Update Terakhir <p class="text-xs text-gray-500 dark:text-gray-400 uppercase font-semibold">Pembaruan
Terakhir
</p> </p>
<p class="text-gray-700 dark:text-gray-300"> <p class="text-gray-700 dark:text-gray-300">
{{ $verification->updated_at->format('d M Y') }} {{ $verification->updated_at->translatedFormat('l, d M Y H:i') }}
</p> </p>
<p class="text-xs text-gray-500"> <p class="text-xs text-gray-500">
{{ $verification->updated_at->diffForHumans() }} {{ $verification->updated_at->diffForHumans() }}
@ -284,7 +282,7 @@ class="w-4 h-4 text-gray-500 transition-transform duration-200"
@endif @endif
</div> </div>
<div class="shrink-0 text-xs text-gray-400"> <div class="shrink-0 text-xs text-gray-400">
{{ $review->created_at->format('d M Y, H:i') }} {{ $review->created_at->translatedFormat('l, d M Y H:i') }}
</div> </div>
</div> </div>
</div> </div>
@ -314,7 +312,7 @@ class="w-4 h-4 text-gray-500 transition-transform duration-200"
<span <span
class="flex items-center gap-1 text-xs text-warning-600 dark:text-warning-400 font-medium italic"> 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" /> <x-heroicon-s-clock class="w-3 h-3 animate-pulse" />
Menunggu revisi dari user... Menunggu revisi dari pengguna...
</span> </span>
@elseif($card['isApproved']) @elseif($card['isApproved'])
<span <span

View File

@ -173,7 +173,7 @@ class="w-full flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-800
@endif @endif
</div> </div>
<div class="shrink-0 text-xs text-gray-400"> <div class="shrink-0 text-xs text-gray-400">
{{ $review->created_at->format('d M Y, H:i') }} {{ $review->created_at->translatedFormat('l, d M Y H:i') }}
</div> </div>
</div> </div>
</div> </div>