import { EllipsisVertical, Pencil, Plus, Trash2 } from 'lucide-react' import { Badge, Button, Card, CardContent, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import type { JitUserRule } from './JitDbAccess.types' import { getJitStatusDisplay } from './JitDbAccess.utils' interface JitDbAccessRulesTableProps { users: JitUserRule[] isLoading?: boolean canUpdate: boolean disableActions?: boolean allProjectMembersHaveRules?: boolean onAddRule: () => void onEditRule: (user: JitUserRule) => void onDeleteRule: (user: JitUserRule) => void } export function JitDbAccessRulesTable({ users, isLoading = false, canUpdate, disableActions = false, allProjectMembersHaveRules = false, onAddRule, onEditRule, onDeleteRule, }: JitDbAccessRulesTableProps) { const addDisabled = disableActions || !canUpdate || allProjectMembersHaveRules const addRuleTooltip = !canUpdate ? 'Additional permissions required' : allProjectMembersHaveRules ? 'All project members already have temporary access rules' : undefined if (isLoading) { return (
) } return (

Temporary access rules

Manage member access, allowed roles, and expiry settings.

{addRuleTooltip && {addRuleTooltip}}
Member Roles Status Actions {users.length === 0 ? (

No rules yet

Add your first temporary access rule above

) : ( users.map((user) => { const statusDisplay = getJitStatusDisplay(user.status) const enabledGrants = user.grants.filter((grant) => grant.enabled) const rowIsInteractive = canUpdate && !disableActions return ( { if ((event.target as HTMLElement).closest('button')) return onEditRule(user) } : undefined } onKeyDown={ rowIsInteractive ? (event) => { if ((event.target as HTMLElement).closest('button')) return if (event.key === 'Enter' || event.key === ' ') { event.preventDefault() onEditRule(user) } } : undefined } tabIndex={rowIsInteractive ? 0 : undefined} > {user.name &&

{user.name}

}

{user.email}

{enabledGrants.length} role{enabledGrants.length === 1 ? '' : 's'} {statusDisplay.badges.length > 0 ? ( {statusDisplay.badges.map((badge) => ( {badge.label} ))} ) : null}
) }