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. } onClick={onAddRule} disabled={addDisabled} > Add rule {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} } aria-label="More actions" variant="default" size="tiny" className="w-7 hit-area-2" disabled={!canUpdate || disableActions} /> { event.stopPropagation() onEditRule(user) }} disabled={!canUpdate || disableActions} > Edit { event.stopPropagation() onDeleteRule(user) }} disabled={!canUpdate || disableActions} > Delete ) }) )} ) }
Manage member access, allowed roles, and expiry settings.
No rules yet
Add your first temporary access rule above
{user.name}
{user.email}