feat(ui): show two-factor status of team members (#11186)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-08-11 21:10:55 +02:00
1 parent cde9597c09
commit 9794ce2686
6 files changed
+216 -5

No files matched your search

@@ -1,7 +1,10 @@
<div wire:key="team-member-row-{{ $member->id }}"
x-cloak x-show="isMemberVisible({{ $member->id }})"
x-bind:style="{ order: memberOrder({{ $member->id }}) }"
class="data-table-row team-members-table-grid border-b border-neutral-200 last:border-b-0 dark:border-white/[0.07]">
@class([
'data-table-row team-members-table-grid border-b border-neutral-200 last:border-b-0 dark:border-white/[0.07]',
'team-members-table-grid-2fa' => auth()->user()?->can('manageMembers', currentTeam()),
])>
<div>
<div class="flex items-center gap-2">
<div
@@ -24,6 +27,11 @@
{{ data_get($member, 'pivot.role') }}
</span>
</div>
@can('manageMembers', currentTeam())
<div class="flex items-center">
<x-two-factor-badge :enabled="filled($member->two_factor_confirmed_at)" />
</div>
@endcan
<div class="flex justify-end">
@can('manageMembers', currentTeam())
@if ($member->id !== Auth::id())
@@ -4,7 +4,7 @@
sortBy: 'name_asc',
page: 1,
perPage: 10,
members: @js(currentTeam()->members->map(fn ($member) => [
members: @js($members->map(fn ($member) => [
'id' => $member->id,
'name' => $member->name,
'email' => $member->email,
@@ -95,14 +95,31 @@
</div>
</div>
@can('manageMembers', currentTeam())
<div
class="border-b border-neutral-200 px-4 py-2.5 text-[12px] dark:border-white/[0.08]">
@if ($membersWithoutTwoFactorCount > 0)
<span class="text-warning-700 dark:text-warning">{{ $membersWithoutTwoFactorCount }} of {{ $members->count() }} {{ Str::plural('member', $members->count()) }} {{ $membersWithoutTwoFactorCount === 1 ? 'does' : 'do' }} not have two-factor authentication enabled.</span>
@else
<span class="text-neutral-500 dark:text-fg-dim">All members have two-factor authentication enabled.</span>
@endif
</div>
@endcan
<div x-cloak x-show="filteredMembers.length > 0" class="data-table flex flex-col">
<div class="data-table-header team-members-table-grid">
<div @class([
'data-table-header team-members-table-grid',
'team-members-table-grid-2fa' => auth()->user()?->can('manageMembers', currentTeam()),
])>
<span>Name</span>
<span>Email</span>
<span>Role</span>
@can('manageMembers', currentTeam())
<span>2FA</span>
@endcan
<span class="text-right">Actions</span>
</div>
@foreach (currentTeam()->members as $member)
@foreach ($members as $member)
<livewire:team.member :member="$member" :wire:key="$member->id" />
@endforeach
</div>