import React from 'react' import type { AccessControl } from '../../core/types' import { ChevronDown, ChevronRight, CornerUpRight, Refresh } from '../components/icons' import { JsonTree } from '../components/json-tree' import { DetailEmpty, FilterBar, ListItem, ListShell, Section, SplitView } from '../components/layout' import { Alert, Badge, Button } from '../components/ui' import type { IamIDevtoolsEngine } from '../lib/types' export function IamRolesPanel({ engine }: { engine: IamIDevtoolsEngine }) { const [roles, setRoles] = React.useState([]) const [selected, setSelected] = React.useState(null) const [error, setError] = React.useState(null) const [filter, setFilter] = React.useState('') const load = React.useCallback(async () => { try { setError(null) setRoles(await engine.admin.listRoles()) } catch (err) { setError(err instanceof Error ? err.message : String(err)) } }, [engine]) React.useEffect(() => { void load() }, [load]) const filtered = roles.filter( (r) => r.id.toLowerCase().includes(filter.toLowerCase()) || (r.name ?? '').toLowerCase().includes(filter.toLowerCase()), ) const current = roles.find((r) => r.id === selected) ?? null return ( refresh }> {error && {error}} {filtered.length === 0 && !error && } {filtered.map((r) => ( setSelected(r.id)} primary={r.id} secondary={ {r.permissions.length} perms {r.inherits?.length ? ( <> {r.inherits.join(', ')} ) : null} } trailing={{r.permissions.length}} /> ))} } right={ !current ? ( ) : (
{current.id} {current.name} {current.scope && scope: {current.scope}}
{current.description && (

{current.description}

)} {current.inherits && current.inherits.length > 0 && (
{current.inherits.map((id) => ( {id} ))}
)}
{current.permissions.map((p) => ( ))}
) } /> ) } function PermRow({ perm }: { perm: AccessControl.IPermission }) { const [open, setOpen] = React.useState(false) const hasDetail = !!perm.conditions || !!perm.scope return (
{open && hasDetail && perm.conditions && (
)}
) }