import { transformObject, ucFirstAllSnakeToPascalWithSpaces, s, stringIdentifier, } from "bknd/utils"; import { useBkndAuth } from "ui/client/schema/auth/use-bknd-auth"; import { Alert } from "ui/components/display/Alert"; import { bkndModals } from "ui/modals"; import { Button } from "../../components/buttons/Button"; import { CellValue, DataTable } from "../../components/table/DataTable"; import * as AppShell from "../../layouts/AppShell/AppShell"; import { routes, useNavigate } from "../../lib/routes"; import { useBknd } from "ui/client/bknd"; import { useBrowserTitle } from "ui/hooks/use-browser-title"; import { Message } from "ui/components/display/Message"; export function AuthRolesList(props) { useBrowserTitle(["Auth", "Roles"]); const { hasSecrets } = useBknd({ withSecrets: true }); if (!hasSecrets) { return ; } return ; } function AuthRolesListInternal() { const [navigate] = useNavigate(); const { config, actions } = useBkndAuth(); const { readonly } = useBknd(); const data = Object.values( transformObject(config.roles ?? {}, (role, name) => ({ role: name, permissions: role.permissions?.map((p) => p.permission) as string[], policies: role.permissions ?.flatMap((p) => p.policies?.length ?? 0) .reduce((acc, curr) => acc + curr, 0), is_default: role.is_default ?? false, implicit_allow: role.implicit_allow ?? false, })), ); function handleClick(row) { navigate(routes.auth.roles.edit(row.role)); } function openCreateModal() { if (readonly) return; bkndModals.open( "form", { schema: s.strictObject({ name: stringIdentifier, }), uiSchema: { name: { "ui:title": "Role name", }, }, onSubmit: async (data) => { if (data.name.length > 0) { if (await actions.roles.add(data.name)) { navigate(routes.auth.roles.edit(data.name)); } } }, }, { title: "New Role", }, ); } return ( <> Create new ) } > Roles & Permissions
); } const renderValue = ({ value, property }) => { if (["is_default", "implicit_allow"].includes(property)) { return value ? Yes : No; } if (property === "policies") { return value ? {value} : 0; } if (property === "permissions") { const max = 3; let permissions = value || []; const count = permissions.length; if (count > max) { permissions = [...permissions.slice(0, max), `+${count - max}`]; } return (
{permissions.map((p, i) => ( {p} ))}
); } return ; };