2023-05-19 09:49:29 +09:00
|
|
|
import { ActionIcon, Drawer, Tooltip } from '@mantine/core';
|
2023-01-23 23:56:38 +09:00
|
|
|
import { useHotkeys } from '@mantine/hooks';
|
2023-05-19 09:49:29 +09:00
|
|
|
import { IconBrandDocker } from '@tabler/icons-react';
|
2022-06-20 09:00:42 +02:00
|
|
|
import Docker from 'dockerode';
|
2022-08-22 09:50:54 +02:00
|
|
|
import { useTranslation } from 'next-i18next';
|
2023-06-10 12:35:37 +02:00
|
|
|
import { useState } from 'react';
|
2023-07-21 18:08:40 +09:00
|
|
|
import { api } from '~/utils/api';
|
|
|
|
|
|
2023-01-19 10:39:39 +09:00
|
|
|
import { useCardStyles } from '../../components/layout/useCardStyles';
|
2023-01-06 12:11:47 +09:00
|
|
|
import { useConfigContext } from '../../config/provider';
|
2022-06-27 19:25:26 +02:00
|
|
|
import ContainerActionBar from './ContainerActionBar';
|
2022-07-06 18:08:39 +02:00
|
|
|
import DockerTable from './DockerTable';
|
2022-06-20 09:00:42 +02:00
|
|
|
|
2022-07-21 11:43:43 +02:00
|
|
|
export default function DockerMenuButton(props: any) {
|
2022-06-20 09:00:42 +02:00
|
|
|
const [opened, setOpened] = useState(false);
|
2022-06-27 19:25:26 +02:00
|
|
|
const [selection, setSelection] = useState<Docker.ContainerInfo[]>([]);
|
2022-12-23 17:17:57 +01:00
|
|
|
const { config } = useConfigContext();
|
2023-01-22 23:10:05 +09:00
|
|
|
const { classes } = useCardStyles(true);
|
2022-12-23 17:17:57 +01:00
|
|
|
|
|
|
|
|
const dockerEnabled = config?.settings.customization.layout.enabledDocker || false;
|
2022-07-21 11:43:43 +02:00
|
|
|
|
2023-06-10 12:35:37 +02:00
|
|
|
const { data, refetch } = api.docker.containers.useQuery(undefined, {
|
2023-05-19 09:49:29 +09:00
|
|
|
enabled: dockerEnabled,
|
|
|
|
|
});
|
|
|
|
|
useHotkeys([['mod+B', () => setOpened(!opened)]]);
|
|
|
|
|
|
2022-08-25 11:07:25 +02:00
|
|
|
const { t } = useTranslation('modules/docker');
|
2022-07-21 11:43:43 +02:00
|
|
|
|
2023-05-19 09:49:29 +09:00
|
|
|
const reload = () => {
|
|
|
|
|
refetch();
|
|
|
|
|
setSelection([]);
|
|
|
|
|
};
|
2022-12-23 17:44:51 +01:00
|
|
|
|
2023-06-28 19:52:45 +09:00
|
|
|
if (!dockerEnabled) return null;
|
|
|
|
|
|
2022-06-20 09:00:42 +02:00
|
|
|
return (
|
|
|
|
|
<>
|
2022-07-26 00:51:55 +02:00
|
|
|
<Drawer
|
|
|
|
|
opened={opened}
|
2023-01-23 23:56:38 +09:00
|
|
|
trapFocus={false}
|
2022-07-26 00:51:55 +02:00
|
|
|
onClose={() => setOpened(false)}
|
|
|
|
|
padding="xl"
|
2023-01-04 22:45:51 +09:00
|
|
|
position="right"
|
2023-03-03 00:37:22 +09:00
|
|
|
size="100%"
|
2022-07-26 00:51:55 +02:00
|
|
|
title={<ContainerActionBar selected={selection} reload={reload} />}
|
2023-03-03 00:37:22 +09:00
|
|
|
transitionProps={{
|
|
|
|
|
transition: 'pop',
|
|
|
|
|
}}
|
2023-01-31 18:06:49 +01:00
|
|
|
styles={{
|
2023-03-03 00:37:22 +09:00
|
|
|
content: {
|
2023-01-31 18:06:49 +01:00
|
|
|
display: 'flex',
|
|
|
|
|
flexDirection: 'column',
|
|
|
|
|
},
|
|
|
|
|
body: {
|
|
|
|
|
minHeight: 0,
|
|
|
|
|
},
|
|
|
|
|
}}
|
2022-07-26 00:51:55 +02:00
|
|
|
>
|
2023-06-10 12:35:37 +02:00
|
|
|
<DockerTable containers={data ?? []} selection={selection} setSelection={setSelection} />
|
2022-06-20 09:00:42 +02:00
|
|
|
</Drawer>
|
2022-08-22 09:50:54 +02:00
|
|
|
<Tooltip label={t('actionIcon.tooltip')}>
|
2022-06-20 09:00:42 +02:00
|
|
|
<ActionIcon
|
|
|
|
|
variant="default"
|
2023-01-19 10:39:39 +09:00
|
|
|
className={classes.card}
|
2022-06-20 09:00:42 +02:00
|
|
|
radius="md"
|
|
|
|
|
size="xl"
|
|
|
|
|
color="blue"
|
|
|
|
|
onClick={() => setOpened(true)}
|
|
|
|
|
>
|
|
|
|
|
<IconBrandDocker />
|
|
|
|
|
</ActionIcon>
|
2022-07-26 01:21:04 +02:00
|
|
|
</Tooltip>
|
2022-06-20 09:00:42 +02:00
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|