import React, { useContext, useEffect } from "react"; import { Modal, Form, Select, InputNumber, Switch, Alert } from "antd"; import { ControlContext, useRoles } from "@clusterio/web_ui"; import { RoleMappingRecord, RoleMappingCreateRequest, RoleMappingUpdateRequest } from "../../messages"; import type { WebPlugin } from ".."; export default function RoleMappingForm({ open, setOpen, initial }: { open: boolean, setOpen: (open: boolean) => void, initial?: RoleMappingRecord, }) { const control = useContext(ControlContext); const plugin = control.plugins.get("exp_groups") as WebPlugin; const [groups] = plugin.useGroups(); const [roles] = useRoles(); const [form] = Form.useForm(); function submit(values: any) { if (initial) { control.send(new RoleMappingUpdateRequest( new RoleMappingRecord( initial.id, new Set(values.roleIds), values.groupId, values.priority, values.enabled, ) )); } else { control.send(new RoleMappingCreateRequest( values.roleIds, values.groupId, values.priority, values.enabled, )); } setOpen(false); } useEffect(() => { if (open) { form.resetFields(); form.setFieldsValue({ ...initial, roleIds: initial ? [...initial.roleIds] : [], }); } }, [open, initial]); return setOpen(false)} onOk={() => form.submit()} >
  • Manual assignments always take priority.
  • Mappings are checked in priority order (highest first).
  • A mapping applies only if the user has all listed roles.
  • The first matching mapping assigns the group.
  • If none match, the player is given all permissions.
  • } />
    ; }