import React, { useState, useCallback, useSyncExternalStore } from "react";
import { WebPluginContext, PageLayout, PageHeader, useAccount, SectionHeader } from "@clusterio/web_ui";
import { Button } from "antd";
import * as messages from "../messages.js";
import * as lib from "@clusterio/lib";
import GroupsTable from "./components/GroupsTable";
import AssignmentsTable from "./components/AssignmentsTable";
import RoleMappingsTable from "./components/RoleMappingsTable";
import GroupViewPage from "./components/GroupViewPage";
import GroupForm from "./components/GroupForm";
import RoleMappingForm from "./components/RoleMappingForm";
import AssignmentForm from "./components/AssignmentForm";
function ExpGroupsPage() {
const account = useAccount();
const [groupOpen, setGroupOpen] = useState(false);
const [assignmentOpen, setAssignmentOpen] = useState(false);
const [roleMappingOpen, setRoleMappingOpen] = useState(false);
return
{account.hasPermission("exp_groups.group.list") && <>
setGroupOpen(true)}>Create
: undefined
}
/>
>}
{account.hasPermission("exp_groups.role_mapping.list") && <>
setRoleMappingOpen(true)}>Create
: undefined
}
/>
>}
{account.hasPermission("exp_groups.assignment.list") && <>
setAssignmentOpen(true)}>Create
: undefined
}
/>
>}
;
}
let groups: lib.MapSubscriber | undefined;
let assignments: lib.MapSubscriber | undefined;
let roleMappings: lib.MapSubscriber | undefined;
export function useGroups() {
const subscribe = useCallback((cb: () => void) => groups!.subscribe(cb), []);
return useSyncExternalStore(subscribe, () => groups!.getSnapshot());
}
export function useAssignments() {
const subscribe = useCallback((cb: () => void) => assignments!.subscribe(cb), []);
return useSyncExternalStore(subscribe, () => assignments!.getSnapshot());
}
export function useRoleMappings() {
const subscribe = useCallback((cb: () => void) => roleMappings!.subscribe(cb), []);
return useSyncExternalStore(subscribe, () => roleMappings!.getSnapshot());
}
export default function registerPlugin(context: WebPluginContext) {
context.control.hooks.pages.attach("exp_groups", () => [
{
path: "/permission_groups",
sidebarName: "Permission Groups",
permission: (account => account.hasAnyPermission(
"exp_groups.group.list",
"exp_groups.assignment.list",
"exp_groups.role_mapping.list",
)),
content: ,
},
{
path: "/permission_groups/:id/view",
sidebarPath: "/permission_groups",
permission: "exp_groups.group.get",
content: ,
},
]);
groups = new lib.MapSubscriber(messages.GroupUpdatedEvent, context.control);
assignments = new lib.MapSubscriber(messages.ManualAssignmentUpdatedEvent, context.control);
roleMappings = new lib.MapSubscriber(messages.RoleMappingUpdatedEvent, context.control);
}