import React, { useEffect, useContext, useState } from "react"; import { useHistory, useParams } from "react-router-dom"; import { Button, Checkbox, Form, Input, PageHeader, Popconfirm, Spin } from "antd"; import DeleteOutlined from "@ant-design/icons/DeleteOutlined"; import { libLink, libUsers } from "@clusterio/lib"; import { useAccount } from "../model/account"; import ControlContext from "./ControlContext"; import PageLayout from "./PageLayout"; import PluginExtra from "./PluginExtra"; import { notifyErrorHandler } from "../util/notify"; function useRole(id) { let control = useContext(ControlContext); let [role, setRole] = useState({ loading: true }); function updateRole() { // XXX optimize by requesting only the role in question libLink.messages.listRoles.send(control).then(result => { let match = result.list.find(u => u.id === id); if (!match) { setRole({ missing: true }); } else { setRole({ ...match, present: true, }); } }); } useEffect(() => { updateRole(); }, [id]); return [role, updateRole]; } export default function RoleViewPage() { let params = useParams(); let roleId = Number(params.id); let history = useHistory(); let account = useAccount(); let control = useContext(ControlContext); let [role, updateRole] = useRole(roleId); let [edited, setEdited] = useState(false); let nav = [{ name: "Roles", path: "/roles" }, { name: role["name"] || roleId }]; if (role.loading) { return ; } if (role.missing) { return

Role with id {roleId} was not found on the master server.

; } let initialValues = { name: role["name"], description: role["description"], permissions: { ...Object.fromEntries([...libUsers.permissions.values()].map(perm => [ perm.name, role["permissions"].includes(perm.name), ])), }, }; let canUpdate = account.hasPermission("core.role.update"); return
{ setEdited(true); }} onFinish={values => { let newPermissions = []; for (let [name, value] of Object.entries(values.permissions)) { if (value) { newPermissions.push(name); } } libLink.messages.updateRole.send(control, { id: roleId, name: values.name || "", description: values.description || "", permissions: newPermissions, }).then(() => { setEdited(false); updateRole(); }).catch(notifyErrorHandler("Error applying changes")); }} > {canUpdate && } {account.hasPermission("core.role.delete") && { libLink.messages.deleteRole.send( control, { id: roleId } ).then(() => { history.push("/roles"); }).catch(notifyErrorHandler("Error deleting role")); }} > } } />

Permissions

{[...libUsers.permissions.values()].map(({name, title, description}) => ( ))}
; }