import React, { useContext, useState, useRef } from "react"; import { Table, Button, Space, Input, InputRef } from "antd"; import { EditOutlined, SearchOutlined } from "@ant-design/icons"; import { ControlContext, useAccount } from "@clusterio/web_ui"; import { AssignmentDeleteRequest, AssignmentRecord } from "../../messages"; import type { WebPlugin } from ".."; import AssignmentForm from "./AssignmentForm"; import DeletedConfirm from "./DeleteConfirm"; const strcmp = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" }).compare; export default function AssignmentsTable() { const control = useContext(ControlContext); const plugin = control.plugins.get("exp_groups") as WebPlugin; const account = useAccount(); const searchInput = useRef(null); const [assignments, assignmentsSynced] = plugin.useAssignments(); const [groups, groupsSynced] = plugin.useGroups(); const [editing, setEditing] = useState(); const [open, setOpen] = useState(false); const assignmentsArray = [...assignments.values()]; const groupFilters = [...groups.values()] .filter(group => assignmentsArray.some(assignment => assignment.groupId === group.id)) .map(group => ({ text: group.name, value: group.id })) return <> strcmp(a.name, b.name), filterIcon: (filtered: boolean) => ( ), onFilter: (value, record: AssignmentRecord) => ( record.name.toLowerCase().includes(String(value).toLowerCase()) ), filterDropdownProps: { onOpenChange: (open: boolean) => open && setTimeout(() => searchInput.current?.select(), 100), }, filterDropdown: ({ selectedKeys, setSelectedKeys, confirm, clearFilters }) => (
e.stopPropagation()}> setSelectedKeys([e.target.value])} onSearch={() => confirm({ closeDropdown: false })} onClear={() => { clearFilters?.({ closeDropdown: false }); confirm({ closeDropdown: true }); }} />
), }, { title: "Group", width: "40%", filters: groupFilters, onFilter: (value, record: AssignmentRecord) => ( record.groupId === value ), render: (_: any, a: any) => ( groups.get(a.groupId)?.name ?? a.groupId ), }, ...(account.hasAnyPermission( "exp_groups.assignment.update", "exp_groups.assignment.delete", ) ? [{ title: "Actions", width: "10%", render: (_: any, record: AssignmentRecord) => ( {account.hasPermission("exp_groups.assignment.update") &&