You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.8 KiB
94 lines
2.8 KiB
import { FC, useState } from 'react'; |
|
|
|
import CrudList from '../CrudList'; |
|
import { DialogScrollBox } from '../Dialog'; |
|
import FormSummary from '../FormSummary'; |
|
import HostListItem from './HostListItem'; |
|
import IconButton from '../IconButton'; |
|
import PrepareHostForm from './PrepareHostForm'; |
|
import TestAccessForm from './TestAccessForm'; |
|
import { BodyText } from '../Text'; |
|
|
|
const ManageHost: FC = () => { |
|
const [inquireHostResponse, setInquireHostResponse] = useState< |
|
InquireHostResponse | undefined |
|
>(); |
|
|
|
return ( |
|
<CrudList<APIHostOverview, APIHostDetail> |
|
formDialogProps={{ |
|
common: { |
|
onClose: ({ handlers: { base } }, ...args) => { |
|
base?.call(null, ...args); |
|
setInquireHostResponse(undefined); |
|
}, |
|
}, |
|
}} |
|
addHeader="Initialize host" |
|
editHeader="" |
|
entriesUrl="/host?types=dr,node" |
|
entryUrlPrefix="/host" |
|
getDeleteErrorMessage={(children, ...rest) => ({ |
|
...rest, |
|
children: <>Failed to delete host(s). {children}</>, |
|
})} |
|
getDeleteHeader={(count) => `Delete the following ${count} host(s)?`} |
|
getDeleteSuccessMessage={() => ({ |
|
children: <>Successfully deleted host(s)</>, |
|
})} |
|
listEmpty="No host(s) found" |
|
listProps={{ |
|
allowAddItem: true, |
|
allowEdit: false, |
|
// There's no edit mode for host list right now, use the edit dialog to |
|
// display the details of a host. |
|
allowItemButton: true, |
|
}} |
|
renderAddForm={(tools) => ( |
|
<> |
|
<TestAccessForm setResponse={setInquireHostResponse} /> |
|
{inquireHostResponse && ( |
|
<PrepareHostForm host={inquireHostResponse} tools={tools} /> |
|
)} |
|
</> |
|
)} |
|
renderDeleteItem={(hosts, { key }) => { |
|
const host = hosts?.[key]; |
|
|
|
return <BodyText>{host?.shortHostName}</BodyText>; |
|
}} |
|
renderEditForm={(tools, detail) => |
|
detail && ( |
|
<DialogScrollBox> |
|
<FormSummary |
|
entries={detail} |
|
renderEntryValue={(base, ...args) => { |
|
const { |
|
0: { entry, key }, |
|
} = args; |
|
|
|
if (key === 'command') |
|
return ( |
|
<IconButton |
|
iconProps={{ fontSize: 'small' }} |
|
mapPreset="copy" |
|
onClick={() => |
|
navigator.clipboard.writeText(String(entry)) |
|
} |
|
size="small" |
|
/> |
|
); |
|
|
|
return base(...args); |
|
}} |
|
hasPassword |
|
/> |
|
</DialogScrollBox> |
|
) |
|
} |
|
renderListItem={(uuid, host) => <HostListItem data={host} />} |
|
/> |
|
); |
|
}; |
|
|
|
export default ManageHost;
|
|
|