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 ;
};