Files
Homarr/src/components/Settings/Customization/Layout/LayoutSelector.tsx

168 lines
4.9 KiB
TypeScript
Raw Normal View History

2022-12-04 17:36:30 +01:00
import {
2022-12-06 21:33:12 +01:00
ActionIcon,
2022-12-04 17:36:30 +01:00
Center,
Checkbox,
createStyles,
Flex,
2022-12-04 17:36:30 +01:00
Group,
Paper,
Stack,
Text,
Title,
2022-12-06 21:33:12 +01:00
useMantineTheme,
2022-12-04 17:36:30 +01:00
} from '@mantine/core';
import { ChangeEvent, Dispatch, SetStateAction, useState } from 'react';
2022-12-06 21:22:37 +01:00
import { useConfigContext } from '../../../../config/provider';
import { useConfigStore } from '../../../../config/store';
import { CustomizationSettingsType } from '../../../../types/settings';
import { Logo } from '../../../layout/Logo';
2022-12-04 17:36:30 +01:00
interface LayoutSelectorProps {
defaultLayout: CustomizationSettingsType['layout'] | undefined;
}
// TODO: add translations
export const LayoutSelector = ({ defaultLayout }: LayoutSelectorProps) => {
const { classes } = useStyles();
const { name: configName } = useConfigContext();
const updateConfig = useConfigStore((x) => x.updateConfig);
const [leftSidebar, setLeftSidebar] = useState(defaultLayout?.enabledLeftSidebar ?? true);
const [rightSidebar, setRightSidebar] = useState(defaultLayout?.enabledRightSidebar ?? true);
const [docker, setDocker] = useState(defaultLayout?.enabledDocker ?? false);
const [ping, setPing] = useState(defaultLayout?.enabledPing ?? false);
const [searchBar, setSearchBar] = useState(defaultLayout?.enabledSearchbar ?? false);
2022-12-06 21:33:12 +01:00
const { colors, colorScheme } = useMantineTheme();
2022-12-04 17:36:30 +01:00
if (!configName) return null;
const handleChange = (
key: keyof CustomizationSettingsType['layout'],
event: ChangeEvent<HTMLInputElement>,
setState: Dispatch<SetStateAction<boolean>>
) => {
const value = event.target.checked;
setState(value);
updateConfig(configName, (prev) => {
2022-12-06 21:33:12 +01:00
const { layout } = prev.settings.customization;
2022-12-04 17:36:30 +01:00
layout[key] = value;
return {
...prev,
settings: {
...prev.settings,
customization: {
...prev.settings.customization,
layout,
},
},
};
});
};
return (
<Stack spacing="xs">
<Title order={6}>Dashboard layout</Title>
<Paper px="xs" py={4} withBorder>
<Group position="apart">
<Logo size="xs" />
<Group spacing={5}>
{searchBar ? (
<Paper
style={{
height: 10,
backgroundColor: colorScheme === 'dark' ? colors.gray[8] : colors.gray[1],
}}
p={2}
w={60}
/>
) : null}
{docker ? <ActionIcon size={10} disabled /> : null}
</Group>
2022-12-04 17:36:30 +01:00
</Group>
</Paper>
<Group align="stretch">
{leftSidebar && (
<Paper className={classes.secondaryWrapper} p="xs" withBorder>
<Flex align="center" justify="center" direction="column">
<Text align="center">Sidebar</Text>
<Text color="dimmed" size="xs" align="center">
Only for
<br />
services &<br />
integrations
</Text>
</Flex>
</Paper>
)}
2022-12-04 17:36:30 +01:00
<Paper className={classes.primaryWrapper} p="xs" withBorder>
<Text align="center">Main</Text>
<Text color="dimmed" size="xs" align="center">
Cannot be turned of.
</Text>
2022-12-04 17:36:30 +01:00
</Paper>
{rightSidebar && (
<Paper className={classes.secondaryWrapper} p="xs" withBorder>
<Flex align="center" justify="center" direction="column">
<Text align="center">Sidebar</Text>
<Text color="dimmed" size="xs" align="center">
Only for
<br />
services &<br />
integrations
</Text>
</Flex>
2022-12-04 17:36:30 +01:00
</Paper>
)}
</Group>
2022-12-04 17:36:30 +01:00
<Stack spacing="xs">
<Checkbox
label="Enable left sidebar"
description="Optional. Can be used for services and integrations only"
checked={leftSidebar}
onChange={(ev) => handleChange('enabledLeftSidebar', ev, setLeftSidebar)}
/>
<Checkbox
label="Enable right sidebar"
description="Optional. Can be used for services and integrations only"
checked={rightSidebar}
onChange={(ev) => handleChange('enabledRightSidebar', ev, setRightSidebar)}
/>
<Checkbox
label="Enable search bar"
checked={searchBar}
onChange={(ev) => handleChange('enabledSearchbar', ev, setSearchBar)}
/>
<Checkbox
label="Enable docker"
checked={docker}
onChange={(ev) => handleChange('enabledDocker', ev, setDocker)}
/>
<Checkbox
label="Enable pings"
checked={ping}
onChange={(ev) => handleChange('enabledPing', ev, setPing)}
/>
2022-12-04 17:36:30 +01:00
</Stack>
</Stack>
2022-12-04 17:36:30 +01:00
);
};
const useStyles = createStyles((theme) => ({
primaryWrapper: {
flexGrow: 2,
2022-12-04 17:36:30 +01:00
},
secondaryWrapper: {
flexGrow: 1,
maxWidth: 100,
2022-12-04 17:36:30 +01:00
},
}));