{{-- Investors attendance table — props: $committee : Committee $investorAttendances : Collection keyed by investor_id (may be empty) $hideOwnTitle? : true → no

, the consumer renders its own header (committee show page does this so all sub-tables share the parent's header). Four visible columns per row: - Avatar (DB column `avatar_path` on the investor; initials fallback) - Name (links to admin investor page) - SELF status — investor's confirmation via the public portal - ADMIN status — manual verification by the dashboard admin (select) Phone + email were dropped from this table in 2026-06; the row's name link still leads to the investor show page where the contact info is one click away. The admin verification dropdown PATCHes `admin.committees.investors.attendance` and updates the row in-place via fetch — no full-page reload required. --}} @php use App\Models\CommitteeAttendance; $selfLabels = [ CommitteeAttendance::STATUS_PENDING => __('admin.committees.attendance.self.pending'), CommitteeAttendance::STATUS_CONFIRMED => __('admin.committees.attendance.self.confirmed'), CommitteeAttendance::STATUS_CANCELLED => __('admin.committees.attendance.self.cancelled'), ]; $adminLabels = [ CommitteeAttendance::ADMIN_PENDING => __('admin.committees.attendance.admin.pending'), CommitteeAttendance::ADMIN_ATTENDED => __('admin.committees.attendance.admin.attended'), CommitteeAttendance::ADMIN_DID_NOT_ATTEND => __('admin.committees.attendance.admin.did_not_attend'), ]; $initialsOfInv = function (?string $name): string { $name = trim((string) $name); if ($name === '') return '—'; $parts = preg_split('/\s+/u', $name); return mb_strtoupper(mb_substr($parts[0] ?? '', 0, 1) . mb_substr($parts[1] ?? '', 0, 1)); }; @endphp @php $hideOwnTitle = $hideOwnTitle ?? false; @endphp
@if (! $hideOwnTitle)

{{ __('admin.committees.actions_tabs.members') }} ({{ $committee->investors->count() }})

@endif
@if ($committee->investors->isEmpty())
—
@else
@foreach ($committee->investors as $investor) @php $row = $investorAttendances->get($investor->id); $self = $row?->status ?? CommitteeAttendance::STATUS_PENDING; $adminVal = $row?->admin_status ?? CommitteeAttendance::ADMIN_PENDING; $avatarUrl = ! empty($investor->avatar_path) ? \Illuminate\Support\Facades\Storage::disk('public')->url($investor->avatar_path) : null; @endphp @endforeach
  {{ __('admin.committees.attendance.columns.member') }} {{ __('admin.committees.attendance.columns.self_status') }} {{ __('admin.committees.attendance.columns.admin_status') }}
@if ($avatarUrl) @else {{ $initialsOfInv($investor->display_name) }} @endif {{ $investor->display_name }} @php $chipClass = match ($self) { CommitteeAttendance::STATUS_CONFIRMED => 'cmt-att-chip cmt-att-chip--ok', CommitteeAttendance::STATUS_CANCELLED => 'cmt-att-chip cmt-att-chip--danger', default => 'cmt-att-chip cmt-att-chip--neutral', }; @endphp {{ $selfLabels[$self] ?? $self }} ✓ {{ __('admin.committees.attendance.saved') }} ! {{ __('admin.committees.attendance.save_failed') }}
@endif
@once @push('scripts') @endpush @endonce