import React, { useEffect, useContext, useState } from "react"; import { useHistory, useParams } from "react-router-dom"; import { Button, Checkbox, Col, Form, Input, Popconfirm, Row, Space, Spin } from "antd"; import DeleteOutlined from "@ant-design/icons/DeleteOutlined"; import libLink from "@clusterio/lib/link"; import libUsers from "@clusterio/lib/users"; import ControlContext from "./ControlContext"; import PageLayout from "./PageLayout"; 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 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

{roleId}

; } if (role.missing) { return

Role not found

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), ])), }, }; 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")); }} >

{role["name"]}

{ libLink.messages.deleteRole.send( control, { id: roleId } ).then(() => { history.push("/roles"); }).catch(notifyErrorHandler("Error deleting role")); }} >

Permissions

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