From c600ee131b7078dcc8f31654ced0832b8db97a40 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 17 Mar 2026 14:04:10 +0700 Subject: [PATCH] refactor: Remove AdminVerification page and restructure verification actions into separate classes for improved organization and maintainability. --- app/Filament/Pages/AdminVerification.php | 340 ------------------ .../Actions/ApproveAction.php | 34 ++ .../Actions/Concerns/CanProcessReview.php | 113 ++++++ .../Actions/RejectAction.php | 43 +++ .../Actions/RevisionAction.php | 43 +++ .../Pages/AdminVerification/Index.php | 239 ++++++++++++ .../pages/admin-verification.blade.php | 224 ++++-------- 7 files changed, 535 insertions(+), 501 deletions(-) delete mode 100644 app/Filament/Pages/AdminVerification.php create mode 100644 app/Filament/Pages/AdminVerification/Actions/ApproveAction.php create mode 100644 app/Filament/Pages/AdminVerification/Actions/Concerns/CanProcessReview.php create mode 100644 app/Filament/Pages/AdminVerification/Actions/RejectAction.php create mode 100644 app/Filament/Pages/AdminVerification/Actions/RevisionAction.php create mode 100644 app/Filament/Pages/AdminVerification/Index.php diff --git a/app/Filament/Pages/AdminVerification.php b/app/Filament/Pages/AdminVerification.php deleted file mode 100644 index 82ae95a..0000000 --- a/app/Filament/Pages/AdminVerification.php +++ /dev/null @@ -1,340 +0,0 @@ -pending()->count(); - } - - public function getVerifications(): LengthAwarePaginator - { - $query = VerificationRequest::with([ - 'company.user', - 'company.partnerMedia', - 'company.partnerMedia.journalists', - 'submittedBy', - 'reviews.reviewer', - ]) - ->latest('updated_at'); - - // Apply status filter - if ($this->filterStatus !== 'all') { - $query->where('status', $this->filterStatus); - } - - return $query->paginate(12); - } - - public function setFilter(string $status): void - { - $this->filterStatus = $status; - } - - public function getStatusCounts(): array - { - return [ - 'all' => VerificationRequest::count(), - 'pending' => VerificationRequest::pending()->count(), - 'revision' => VerificationRequest::needRevision()->count(), - 'approved' => VerificationRequest::approved()->count(), - 'rejected' => VerificationRequest::rejected()->count(), - ]; - } - - /** - * Get company name from verification request - */ - public function getCompanyName(VerificationRequest $request): string - { - return $request->company?->name ?? 'Data tidak ditemukan'; - } - - /** - * Get detail URL for the company - */ - public function getDetailUrl(VerificationRequest $request): ?string - { - if (! $request->company || ! $request->company->user_id) { - return null; - } - - return ViewPartner::getUrl(['record' => $request->company->user_id]); - } - - /** - * Get verification summary data - */ - public function getVerificationSummary(VerificationRequest $request): array - { - $company = $request->company; - $media = $company?->partnerMedia; - $journalists = $media?->journalists ?? collect(); - - return [ - 'company' => [ - 'name' => $company?->name ?? 'Belum diisi', - 'email' => $company?->email ?? '-', - 'exists' => $company !== null, - ], - 'media' => [ - 'name' => $media?->name ?? 'Belum diisi', - 'type' => $media?->type?->getLabel() ?? '-', - 'exists' => $media !== null, - ], - 'journalists' => [ - 'count' => $journalists->count(), - 'names' => $journalists->pluck('name')->take(3)->toArray(), - 'exists' => $journalists->count() > 0, - ], - ]; - } - - /** - * Get card data for verification request - */ - public function getCardData(VerificationRequest $verification): array - { - $latestReview = $verification->reviews->first(); - $summary = $this->getVerificationSummary($verification); - $status = $verification->status; - - return [ - 'companyName' => $this->getCompanyName($verification), - 'detailUrl' => $this->getDetailUrl($verification), - 'status' => $status, - 'statusLabel' => $status->getLabel(), - 'statusColor' => $status->getColor(), - 'summary' => $summary, - 'latestReview' => $latestReview, - 'latestReviewNote' => $latestReview?->note, - 'latestReviewDecision' => $latestReview?->decision, - 'latestReviewDecisionLabel' => $latestReview?->decision?->getLabel(), - 'latestReviewDecisionColor' => $latestReview?->decision?->getColor(), - 'latestReviewReviewer' => $latestReview?->reviewer?->name ?? 'Admin', - 'latestReviewCreatedAt' => $latestReview?->created_at, - 'submittedBy' => $verification->submittedBy?->name ?? 'Unknown', - 'reviewsCount' => $verification->reviews->count(), - 'canApprove' => $status === VerificationStatus::PENDING, - 'isPending' => $status === VerificationStatus::PENDING, - 'isRevision' => $status === VerificationStatus::NEED_REVISION, - 'isApproved' => $status === VerificationStatus::APPROVED, - 'isRejected' => $status === VerificationStatus::REJECTED, - ]; - } - - /** - * Approve verification action - */ - public function approveAction(): Action - { - return Action::make('approve') - ->label('Setujui') - ->color('success') - ->icon('heroicon-o-check') - ->size('sm') - ->requiresConfirmation() - ->modalHeading('Setujui Verifikasi') - ->modalDescription('Apakah Anda yakin ingin menyetujui verifikasi ini? Pastikan data sudah benar dan lengkap.') - ->modalSubmitActionLabel('Ya, Setujui') - ->action(function (array $arguments, array $data): void { - $this->processReview($arguments['id'], DecisionAdmin::APPROVED, $data['note'] ?? null); - }); - } - - /** - * Revision verification action - */ - public function revisionAction(): Action - { - return Action::make('revision') - ->label('Minta Revisi') - ->color('warning') - ->icon('heroicon-o-pencil-square') - ->size('sm') - ->modalHeading('Minta Revisi') - ->modalDescription('Pengguna akan diminta untuk memperbaiki data sesuai catatan yang diberikan.') - ->schema([ - Textarea::make('note') - ->label('Catatan Revisi') - ->required() - ->placeholder('Jelaskan bagian yang perlu diperbaiki...') - ->autocomplete(false) - ->autofocus(), - ]) - ->action(function (array $arguments, array $data): void { - $this->processReview($arguments['id'], DecisionAdmin::NEED_REVISION, $data['note']); - }) - ->modalWidth(Width::Large); - } - - /** - * Reject verification action - */ - public function rejectAction(): Action - { - return Action::make('reject') - ->label('Tolak') - ->color('danger') - ->icon('heroicon-o-x-mark') - ->size('sm') - ->requiresConfirmation() - ->modalHeading('Tolak Verifikasi') - ->modalDescription('Pengajuan akan ditolak secara permanen. Pengguna tidak dapat mengajukan ulang untuk data ini.') - ->modalSubmitActionLabel('Ya, Tolak') - ->schema([ - Textarea::make('note') - ->label('Alasan Penolakan') - ->required() - ->placeholder('Jelaskan alasan pengajuan ditolak...') - ->autocomplete(false) - ->autofocus(), - ]) - ->action(function (array $arguments, array $data): void { - $this->processReview($arguments['id'], DecisionAdmin::REJECTED, $data['note']); - }); - } - - /** - * Process review decision - */ - protected function processReview(int $requestId, DecisionAdmin $decision, ?string $note): void - { - $verificationRequest = VerificationRequest::with(['company.partnerMedia.journalists'])->find($requestId); - - if (! $verificationRequest) { - CheerfulNotification::danger( - 'Belum ketemu nih 🙌', - 'Data verifikasi belum kami temukan. Coba sebentar lagi, ya.', - ) - ->send(); - - return; - } - - try { - DB::beginTransaction(); - - // Create review record - VerificationReview::create([ - 'verification_request_id' => $verificationRequest->id, - 'reviewer_id' => auth()->id(), - 'decision' => $decision, - 'note' => $note, - ]); - - // Update verification request status - $newStatus = match ($decision) { - DecisionAdmin::APPROVED => VerificationStatus::APPROVED, - DecisionAdmin::NEED_REVISION => VerificationStatus::NEED_REVISION, - DecisionAdmin::REJECTED => VerificationStatus::REJECTED, - }; - - $verificationRequest->update([ - 'status' => $newStatus, - ]); - - DB::commit(); - - $actionLabel = match ($decision) { - DecisionAdmin::APPROVED => 'disetujui', - DecisionAdmin::NEED_REVISION => 'diminta revisi', - DecisionAdmin::REJECTED => 'ditolak', - }; - - CheerfulNotification::success( - 'Berhasil Diproses! ✨', - "Mantap! Verifikasi telah {$actionLabel} dan notifikasi sudah dikirim ke pengguna. Kerja bagus, Admin! 💪" - ) - ->send(); - - // Notify User - $partnerUser = $verificationRequest->company?->user; - if ($partnerUser) { - $statusTitle = match ($decision) { - DecisionAdmin::APPROVED => 'Horee! Verifikasi Disetujui 🎉', - DecisionAdmin::NEED_REVISION => 'Yah, Ada Yang Perlu Direvisi nih 📝', - DecisionAdmin::REJECTED => 'Maaf, Verifikasi Ditolak 😔', - }; - - $body = match ($decision) { - 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::REJECTED => 'Yah, maaf banget... pengajuan verifikasi perusahaan Anda belum bisa kami terima saat ini. 💔', - }; - - if ($note) { - $body .= "\n\nCatatan Admin: {$note}"; - } - - $partnerUser->notify(new BroadcastNotification([ - 'title' => $statusTitle, - 'body' => $body, - 'action' => [ - Action::make('view') - ->label('Lihat') - ->url(Verification::getUrl()), - ], - ])); - } - } catch (\Throwable $e) { - DB::rollBack(); - Log::error('Verification processing failed', [ - 'error' => $e->getMessage(), - 'trace' => $e->getTraceAsString(), - 'request_id' => $requestId, - 'decision' => $decision->value, - ]); - - CheerfulNotification::danger( - 'Terjadi Kesalahan ⚠️', - 'Proses verifikasi gagal karena kesalahan sistem. Tim kami sudah mencatat masalah ini. Silakan coba lagi nanti.', - ) - ->send(); - } - } -} diff --git a/app/Filament/Pages/AdminVerification/Actions/ApproveAction.php b/app/Filament/Pages/AdminVerification/Actions/ApproveAction.php new file mode 100644 index 0000000..9e20308 --- /dev/null +++ b/app/Filament/Pages/AdminVerification/Actions/ApproveAction.php @@ -0,0 +1,34 @@ +label('Setujui') + ->color('success') + ->icon('heroicon-o-check') + ->size('sm') + ->requiresConfirmation() + ->modalHeading('Setujui Verifikasi') + ->modalDescription('Apakah Anda yakin ingin menyetujui verifikasi ini? Pastikan data sudah benar dan lengkap.') + ->modalSubmitActionLabel('Ya, Setujui') + ->action(function (array $arguments): void { + $this->processReview($arguments['id'], DecisionAdmin::APPROVED, null); + }); + } +} diff --git a/app/Filament/Pages/AdminVerification/Actions/Concerns/CanProcessReview.php b/app/Filament/Pages/AdminVerification/Actions/Concerns/CanProcessReview.php new file mode 100644 index 0000000..2ef5f55 --- /dev/null +++ b/app/Filament/Pages/AdminVerification/Actions/Concerns/CanProcessReview.php @@ -0,0 +1,113 @@ +find($requestId); + + if (! $verificationRequest) { + CheerfulNotification::danger( + 'Belum ketemu nih 🙌', + 'Data verifikasi belum kami temukan. Coba sebentar lagi, ya.', + ) + ->send(); + + return; + } + + try { + DB::beginTransaction(); + + // Create review record + VerificationReview::create([ + 'verification_request_id' => $verificationRequest->id, + 'reviewer_id' => auth()->id(), + 'decision' => $decision, + 'note' => $note, + ]); + + // Update verification request status + $newStatus = match ($decision) { + DecisionAdmin::APPROVED => VerificationStatus::APPROVED, + DecisionAdmin::NEED_REVISION => VerificationStatus::NEED_REVISION, + DecisionAdmin::REJECTED => VerificationStatus::REJECTED, + }; + + $verificationRequest->update([ + 'status' => $newStatus, + ]); + + DB::commit(); + + $actionLabel = match ($decision) { + DecisionAdmin::APPROVED => 'disetujui', + DecisionAdmin::NEED_REVISION => 'diminta revisi', + DecisionAdmin::REJECTED => 'ditolak', + }; + + CheerfulNotification::success( + 'Berhasil Diproses! ✨', + "Mantap! Verifikasi telah {$actionLabel} dan notifikasi sudah dikirim ke pengguna. Kerja bagus, Admin! 💪" + ) + ->send(); + + // Notify User + $partnerUser = $verificationRequest->company?->user; + if ($partnerUser) { + $statusTitle = match ($decision) { + DecisionAdmin::APPROVED => 'Horee! Verifikasi Disetujui 🎉', + DecisionAdmin::NEED_REVISION => 'Yah, Ada Yang Perlu Direvisi nih 📝', + DecisionAdmin::REJECTED => 'Maaf, Verifikasi Ditolak 😔', + }; + + $body = match ($decision) { + 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::REJECTED => 'Yah, maaf banget... pengajuan verifikasi perusahaan Anda belum bisa kami terima saat ini. 💔', + }; + + if ($note) { + $body .= "\n\nCatatan Admin: {$note}"; + } + + $partnerUser->notify(new BroadcastNotification([ + 'title' => $statusTitle, + 'body' => $body, + 'action' => [ + Action::make('view') + ->label('Lihat') + ->url(Verification::getUrl()), + ], + ])); + } + } catch (\Throwable $e) { + DB::rollBack(); + Log::error('Verification processing failed', [ + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + 'request_id' => $requestId, + 'decision' => $decision->value, + ]); + + CheerfulNotification::danger( + 'Terjadi Kesalahan ⚠️', + 'Proses verifikasi gagal karena kesalahan sistem. Tim kami sudah mencatat masalah ini. Silakan coba lagi nanti.', + ) + ->send(); + } + } +} diff --git a/app/Filament/Pages/AdminVerification/Actions/RejectAction.php b/app/Filament/Pages/AdminVerification/Actions/RejectAction.php new file mode 100644 index 0000000..891e714 --- /dev/null +++ b/app/Filament/Pages/AdminVerification/Actions/RejectAction.php @@ -0,0 +1,43 @@ +label('Tolak') + ->color('danger') + ->icon('heroicon-o-x-mark') + ->size('sm') + ->requiresConfirmation() + ->modalHeading('Tolak Verifikasi') + ->modalDescription('Pengajuan akan ditolak secara permanen. Pengguna tidak dapat mengajukan ulang untuk data ini.') + ->modalSubmitActionLabel('Ya, Tolak') + ->schema([ + Textarea::make('note') + ->label('Alasan Penolakan') + ->required() + ->placeholder('Jelaskan alasan pengajuan ditolak...') + ->autocomplete(false) + ->autofocus(), + ]) + ->action(function (array $arguments, array $data): void { + $this->processReview($arguments['id'], DecisionAdmin::REJECTED, $data['note']); + }); + } +} diff --git a/app/Filament/Pages/AdminVerification/Actions/RevisionAction.php b/app/Filament/Pages/AdminVerification/Actions/RevisionAction.php new file mode 100644 index 0000000..b6e5140 --- /dev/null +++ b/app/Filament/Pages/AdminVerification/Actions/RevisionAction.php @@ -0,0 +1,43 @@ +label('Minta Revisi') + ->color('warning') + ->icon('heroicon-o-pencil-square') + ->size('sm') + ->modalHeading('Minta Revisi') + ->modalDescription('Pengguna akan diminta untuk memperbaiki data sesuai catatan yang diberikan.') + ->schema([ + Textarea::make('note') + ->label('Catatan Revisi') + ->required() + ->placeholder('Jelaskan bagian yang perlu diperbaiki...') + ->autocomplete(false) + ->autofocus(), + ]) + ->action(function (array $arguments, array $data): void { + $this->processReview($arguments['id'], DecisionAdmin::NEED_REVISION, $data['note']); + }) + ->modalWidth(Width::Large); + } +} diff --git a/app/Filament/Pages/AdminVerification/Index.php b/app/Filament/Pages/AdminVerification/Index.php new file mode 100644 index 0000000..9e2b0cd --- /dev/null +++ b/app/Filament/Pages/AdminVerification/Index.php @@ -0,0 +1,239 @@ +user()->can('View:AdminVerification'); + } + + public static function getNavigationBadge(): ?string + { + return VerificationRequest::query()->pending()->count(); + } + + #[Computed] + public function verifications(): LengthAwarePaginator + { + $query = VerificationRequest::with([ + 'company.user', + 'company.partnerMedia', + 'company.partnerMedia.journalists', + 'submittedBy', + 'reviews.reviewer', + ]) + ->latest('updated_at'); + + // Apply status filter + if ($this->filterStatus !== 'all') { + $query->where('status', $this->filterStatus); + } + + return $query->paginate($this->rowsToDisplay) + ->through(function (VerificationRequest $verification) { + $latestReview = $verification->reviews->first(); + $status = $verification->status; + $company = $verification->company; + $media = $company?->partnerMedia; + $journalists = $media?->journalists ?? collect(); + + // Prepare Review classes + $reviewColor = $latestReview?->decision?->getColor() ?? 'gray'; + $reviewClasses = match ($reviewColor) { + 'success' => 'bg-success-50 dark:bg-success-500/10 border-success-200 dark:border-success-500/20', + 'warning' => 'bg-warning-50 dark:bg-warning-500/10 border-warning-200 dark:border-warning-500/20', + 'danger' => 'bg-danger-50 dark:bg-danger-500/10 border-danger-200 dark:border-danger-500/20', + 'info' => 'bg-info-50 dark:bg-info-500/10 border-info-200 dark:border-info-500/20', + default => 'bg-gray-50 dark:bg-gray-500/10 border-gray-200 dark:border-gray-500/20', + }; + + $reviewTitleClasses = match ($reviewColor) { + 'success' => 'text-success-700 dark:text-success-400', + 'warning' => 'text-warning-700 dark:text-warning-400', + 'danger' => 'text-danger-700 dark:text-danger-400', + 'info' => 'text-info-700 dark:text-info-400', + default => 'text-gray-700 dark:text-gray-400', + }; + + return [ + 'id' => $verification->id, + 'company' => [ + 'name' => $company?->name ?? 'Data tidak ditemukan', + 'detailUrl' => ($company && $company->user_id) ? ViewPartner::getUrl(['record' => $company->user_id]) : null, + ], + 'submittedBy' => $verification->submittedBy?->name ?? 'Unknown', + + 'status' => [ + 'value' => $status, + 'label' => $status->getLabel(), + 'color' => $status->getColor(), + 'isPending' => $status === VerificationStatus::PENDING, + 'isRevision' => $status === VerificationStatus::NEED_REVISION, + 'isApproved' => $status === VerificationStatus::APPROVED, + 'isRejected' => $status === VerificationStatus::REJECTED, + ], + + 'timestamps' => [ + 'submittedAt' => $verification->created_at->translatedFormat('l, d M Y H:i'), + 'submittedAtHuman' => $verification->created_at->diffForHumans(), + 'updatedAt' => $verification->updated_at->translatedFormat('l, d M Y H:i'), + 'updatedAtHuman' => $verification->updated_at->diffForHumans(), + ], + + 'summary' => [ + 'company' => [ + 'name' => $company?->name ?? 'Belum diisi', + 'email' => $company?->email ?? '-', + 'exists' => $company !== null, + ], + 'media' => [ + 'name' => $media?->name ?? 'Belum diisi', + 'type' => $media?->type?->getLabel() ?? '-', + 'exists' => $media !== null, + ], + 'journalists' => [ + 'count' => $journalists->count(), + 'names' => $journalists->pluck('name')->take(3)->toArray(), + 'exists' => $journalists->count() > 0, + ], + ], + + 'reviews' => [ + 'count' => $verification->reviews->count(), + 'latest' => [ + 'note' => $latestReview?->note, + 'reviewer' => $latestReview?->reviewer?->name ?? 'Admin', + 'createdAtHuman' => $latestReview?->created_at?->diffForHumans(), + 'classes' => $reviewClasses, + 'titleClasses' => $reviewTitleClasses, + ], + 'history' => $verification->reviews->map(fn ($review) => [ + 'decisionLabel' => $review->decision->getLabel(), + 'decisionColor' => $review->decision->getColor(), + 'reviewerName' => $review->reviewer?->name ?? 'Admin', + 'note' => $review->note, + 'createdAt' => $review->created_at->translatedFormat('l, d M Y H:i'), + ]), + ], + ]; + }); + } + + public function loadMore(): void + { + $this->rowsToDisplay += 12; + } + + public function setFilter(string $status): void + { + $this->filterStatus = $status; + $this->rowsToDisplay = 12; + } + + #[Computed] + public function getFilters(): array + { + return [ + [ + 'id' => 'all', + 'label' => 'Semua', + 'icon' => null, + 'color' => 'primary', + 'count' => VerificationRequest::count(), + ], + [ + 'id' => (string) VerificationStatus::PENDING->value, + 'label' => 'Menunggu', + 'icon' => 'heroicon-s-clock', + 'color' => 'warning', + 'count' => VerificationRequest::pending()->count(), + ], + [ + 'id' => (string) VerificationStatus::NEED_REVISION->value, + 'label' => 'Revisi', + 'icon' => 'heroicon-s-pencil-square', + 'color' => 'info', + 'count' => VerificationRequest::needRevision()->count(), + ], + [ + 'id' => (string) VerificationStatus::APPROVED->value, + 'label' => 'Disetujui', + 'icon' => 'heroicon-s-check-circle', + 'color' => 'success', + 'count' => VerificationRequest::approved()->count(), + ], + [ + 'id' => (string) VerificationStatus::REJECTED->value, + 'label' => 'Ditolak', + 'icon' => 'heroicon-s-x-circle', + 'color' => 'danger', + 'count' => VerificationRequest::rejected()->count(), + ], + ]; + } + + /** + * Approve verification action + */ + public function approveAction(): Action + { + return ApproveAction::make(); + } + + /** + * Revision verification action + */ + public function revisionAction(): Action + { + return RevisionAction::make(); + } + + /** + * Reject verification action + */ + public function rejectAction(): Action + { + return RejectAction::make(); + } +} diff --git a/resources/views/filament/pages/admin-verification.blade.php b/resources/views/filament/pages/admin-verification.blade.php index ca2be95..9180ddf 100644 --- a/resources/views/filament/pages/admin-verification.blade.php +++ b/resources/views/filament/pages/admin-verification.blade.php @@ -1,123 +1,43 @@ - @php - $counts = $this->getStatusCounts(); - @endphp - -
-
- - - - - - - - - -
+ @endforeach
{{-- Verification Cards Grid --}}
- @forelse ($this->getVerifications() as $verification) - @php - $card = $this->getCardData($verification); - @endphp - + @forelse ($this->verifications as $verification)

- {{ $card['companyName'] }} + title="{{ $verification['company']['name'] }}"> + {{ $verification['company']['name'] }}

{{-- Status Badge --}} - - {{ $card['statusLabel'] }} + + {{ $verification['status']['label'] }}
@@ -135,7 +55,7 @@ class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-500/20 flex items-c

Diajukan oleh

- {{ $card['submittedBy'] }} + {{ $verification['submittedBy'] }}

@@ -150,10 +70,10 @@ class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-500/20 flex items-c

- {{ $card['summary']['company']['name'] }} + {{ $verification['summary']['company']['name'] }}

- - {{ $card['summary']['company']['exists'] ? '✓ Lengkap' : '⚠ Belum diisi' }} + + {{ $verification['summary']['company']['exists'] ? '✓ Lengkap' : '⚠ Belum diisi' }} @@ -164,10 +84,10 @@ class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-500/20 flex items-c

Media

- {{ $card['summary']['media']['name'] }} + {{ $verification['summary']['media']['name'] }}

- - {{ $card['summary']['media']['exists'] ? '✓ Lengkap' : '⚠ Belum diisi' }} + + {{ $verification['summary']['media']['exists'] ? '✓ Lengkap' : '⚠ Belum diisi' }} @@ -178,10 +98,10 @@ class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-500/20 flex items-c

Jurnalis

- {{ $card['summary']['journalists']['count'] }} jurnalis + {{ $verification['summary']['journalists']['count'] }} jurnalis

- - {{ $card['summary']['journalists']['exists'] ? '✓ Lengkap' : '⚠ Belum diisi' }} + + {{ $verification['summary']['journalists']['exists'] ? '✓ Lengkap' : '⚠ Belum diisi' }} @@ -191,10 +111,10 @@ class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-500/20 flex items-c

Diajukan

- {{ $verification->created_at->translatedFormat('l, d M Y H:i') }} + {{ $verification['timestamps']['submittedAt'] }}

- {{ $verification->created_at->diffForHumans() }} + {{ $verification['timestamps']['submittedAtHuman'] }}

@@ -202,51 +122,33 @@ class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-500/20 flex items-c Terakhir

- {{ $verification->updated_at->translatedFormat('l, d M Y H:i') }} + {{ $verification['timestamps']['updatedAt'] }}

- {{ $verification->updated_at->diffForHumans() }} + {{ $verification['timestamps']['updatedAtHuman'] }}

{{-- Latest Review Note --}} - @if ($card['latestReviewNote']) - @php - $reviewClasses = match ($card['latestReviewDecisionColor']) { - 'success' - => 'bg-success-50 dark:bg-success-500/10 border-success-200 dark:border-success-500/20', - 'warning' - => 'bg-warning-50 dark:bg-warning-500/10 border-warning-200 dark:border-warning-500/20', - 'danger' - => 'bg-danger-50 dark:bg-danger-500/10 border-danger-200 dark:border-danger-500/20', - 'info' => 'bg-info-50 dark:bg-info-500/10 border-info-200 dark:border-info-500/20', - default => 'bg-gray-50 dark:bg-gray-500/10 border-gray-200 dark:border-gray-500/20', - }; - $reviewTitleClasses = match ($card['latestReviewDecisionColor']) { - 'success' => 'text-success-700 dark:text-success-400', - 'warning' => 'text-warning-700 dark:text-warning-400', - 'danger' => 'text-danger-700 dark:text-danger-400', - 'info' => 'text-info-700 dark:text-info-400', - default => 'text-gray-700 dark:text-gray-400', - }; - @endphp -
-

+ @if ($verification['reviews']['latest']['note']) +

+

Catatan Terakhir

- {{ $card['latestReviewNote'] }} + {{ $verification['reviews']['latest']['note'] }}

- oleh {{ $card['latestReviewReviewer'] }} • - {{ $card['latestReviewCreatedAt']->diffForHumans() }} + oleh {{ $verification['reviews']['latest']['reviewer'] }} • + {{ $verification['reviews']['latest']['createdAtHuman'] }}

@endif {{-- Review History Accordion --}} - @if ($card['reviewsCount'] > 0) + @if ($verification['reviews']['count'] > 0)
- @foreach ($verification->reviews as $review) + @foreach ($verification['reviews']['history'] as $review)
- - {{ $review->decision->getLabel() }} + + {{ $review['decisionLabel'] }} - oleh {{ $review->reviewer?->name ?? 'Admin' }} + oleh {{ $review['reviewerName'] }}
- @if ($review->note) + @if ($review['note'])

- {{ $review->note }} + {{ $review['note'] }}

@endif
- {{ $review->created_at->translatedFormat('l, d M Y H:i') }} + {{ $review['createdAt'] }}
@@ -296,31 +198,31 @@ class="w-4 h-4 text-gray-500 transition-transform duration-200"
{{-- View Detail Button --}} - @if ($card['detailUrl']) + @if ($verification['company']['detailUrl']) + :href="$verification['company']['detailUrl']"> Detail @endif {{-- Action Buttons based on status --}} - @if ($card['isPending']) - {{ ($this->approveAction)(['id' => $verification->id]) }} - {{ ($this->revisionAction)(['id' => $verification->id]) }} - {{ ($this->rejectAction)(['id' => $verification->id]) }} - @elseif($card['isRevision']) + @if ($verification['status']['isPending']) + {{ ($this->approveAction)(['id' => $verification['id']]) }} + {{ ($this->revisionAction)(['id' => $verification['id']]) }} + {{ ($this->rejectAction)(['id' => $verification['id']]) }} + @elseif($verification['status']['isRevision']) Menunggu revisi dari pengguna... - @elseif($card['isApproved']) + @elseif($verification['status']['isApproved']) Verifikasi selesai - @elseif($card['isRejected']) + @elseif($verification['status']['isRejected']) @@ -339,10 +241,10 @@ class="flex items-center gap-1 text-xs text-danger-600 dark:text-danger-400 font @endforelse
- {{-- Pagination --}} - @if ($this->getVerifications()->hasPages()) -
- {{ $this->getVerifications()->links() }} + {{-- Infinite Scroll Sentinel --}} + @if ($this->verifications->hasMorePages()) +
+
@endif