mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-10 07:25:48 +01:00
💄 Improve edit mode UX
This commit is contained in:
@@ -1,13 +1,40 @@
|
|||||||
import { ActionIcon, Tooltip } from '@mantine/core';
|
import { ActionIcon, Button, Tooltip } from '@mantine/core';
|
||||||
import { openContextModal } from '@mantine/modals';
|
import { openContextModal } from '@mantine/modals';
|
||||||
import { IconApps } from '@tabler/icons';
|
import { IconApps } from '@tabler/icons';
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
|
|
||||||
export const AddElementAction = () => {
|
interface AddElementActionProps {
|
||||||
|
type: 'action-icon' | 'button';
|
||||||
|
}
|
||||||
|
|
||||||
|
export const AddElementAction = ({ type }: AddElementActionProps) => {
|
||||||
const { t } = useTranslation('layout/element-selector/selector');
|
const { t } = useTranslation('layout/element-selector/selector');
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 'button':
|
||||||
return (
|
return (
|
||||||
<Tooltip withinPortal label={t('actionIcon.tooltip')}>
|
<Tooltip label={t('actionIcon.tooltip')} withinPortal withArrow>
|
||||||
|
<Button
|
||||||
|
variant="default"
|
||||||
|
radius="md"
|
||||||
|
color="blue"
|
||||||
|
style={{ height: 43 }}
|
||||||
|
onClick={() =>
|
||||||
|
openContextModal({
|
||||||
|
modal: 'selectElement',
|
||||||
|
title: t('modal.title'),
|
||||||
|
size: 'xl',
|
||||||
|
innerProps: {},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<IconApps />
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
case 'action-icon':
|
||||||
|
return (
|
||||||
|
<Tooltip label={t('actionIcon.tooltip')} withinPortal withArrow>
|
||||||
<ActionIcon
|
<ActionIcon
|
||||||
variant="default"
|
variant="default"
|
||||||
radius="md"
|
radius="md"
|
||||||
@@ -26,4 +53,7 @@ export const AddElementAction = () => {
|
|||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
);
|
);
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ActionIcon, Button, Popover, Text, Tooltip } from '@mantine/core';
|
|
||||||
import { IconEditCircle, IconEditCircleOff, IconX } from '@tabler/icons';
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import Consola from 'consola';
|
import Consola from 'consola';
|
||||||
|
import { ActionIcon, Button, Group, Popover, Stack, Text, Tooltip } from '@mantine/core';
|
||||||
|
import { IconEditCircle, IconEditCircleOff, IconX } from '@tabler/icons';
|
||||||
import { getCookie } from 'cookies-next';
|
import { getCookie } from 'cookies-next';
|
||||||
import { Trans, useTranslation } from 'next-i18next';
|
import { Trans, useTranslation } from 'next-i18next';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
@@ -9,6 +9,7 @@ import { useConfigContext } from '../../../../../config/provider';
|
|||||||
import { useScreenSmallerThan } from '../../../../../hooks/useScreenSmallerThan';
|
import { useScreenSmallerThan } from '../../../../../hooks/useScreenSmallerThan';
|
||||||
|
|
||||||
import { useEditModeStore } from '../../../../Dashboard/Views/useEditModeStore';
|
import { useEditModeStore } from '../../../../Dashboard/Views/useEditModeStore';
|
||||||
|
import { AddElementAction } from '../AddElementAction/AddElementAction';
|
||||||
|
|
||||||
export const ToggleEditModeAction = () => {
|
export const ToggleEditModeAction = () => {
|
||||||
const { enabled, toggleEditMode } = useEditModeStore();
|
const { enabled, toggleEditMode } = useEditModeStore();
|
||||||
@@ -32,11 +33,20 @@ export const ToggleEditModeAction = () => {
|
|||||||
setPopoverManuallyHidden(false);
|
setPopoverManuallyHidden(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
const ToggleButtonDesktop = () => (
|
||||||
<Tooltip label={t('tooltip')} withinPortal>
|
<Button
|
||||||
<Popover opened={enabled && !smallerThanSm && !popoverManuallyHidden} width={250} withArrow>
|
onClick={() => toggleButtonClicked()}
|
||||||
<Popover.Target>
|
leftIcon={enabled ? <IconEditCircleOff /> : <IconEditCircle />}
|
||||||
{smallerThanSm ? (
|
variant="default"
|
||||||
|
radius="md"
|
||||||
|
color="blue"
|
||||||
|
style={{ height: 43 }}
|
||||||
|
>
|
||||||
|
<Text>{enabled ? t('button.enabled') : t('button.disabled')}</Text>
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
|
||||||
|
const ToggleActionIconMobile = () => (
|
||||||
<ActionIcon
|
<ActionIcon
|
||||||
onClick={() => toggleButtonClicked()}
|
onClick={() => toggleButtonClicked()}
|
||||||
variant="default"
|
variant="default"
|
||||||
@@ -46,19 +56,36 @@ export const ToggleEditModeAction = () => {
|
|||||||
>
|
>
|
||||||
{enabled ? <IconEditCircleOff /> : <IconEditCircle />}
|
{enabled ? <IconEditCircleOff /> : <IconEditCircle />}
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
) : (
|
);
|
||||||
<Button
|
|
||||||
onClick={() => toggleButtonClicked()}
|
return (
|
||||||
leftIcon={enabled ? <IconEditCircleOff /> : <IconEditCircle />}
|
<Tooltip label={t('tooltip')} withinPortal>
|
||||||
variant="default"
|
<Popover
|
||||||
radius="md"
|
opened={enabled && !smallerThanSm && !popoverManuallyHidden}
|
||||||
color="blue"
|
width={250}
|
||||||
style={{ height: 44 }}
|
zIndex={199}
|
||||||
|
withArrow
|
||||||
>
|
>
|
||||||
<Text>{enabled ? t('button.enabled') : t('button.disabled')}</Text>
|
<Popover.Target>
|
||||||
</Button>
|
{smallerThanSm ? (
|
||||||
|
enabled ? (
|
||||||
|
<Group style={{ flexWrap: 'nowrap' }}>
|
||||||
|
<AddElementAction type="action-icon" />
|
||||||
|
<ToggleActionIconMobile />
|
||||||
|
</Group>
|
||||||
|
) : (
|
||||||
|
<ToggleActionIconMobile />
|
||||||
|
)
|
||||||
|
) : enabled ? (
|
||||||
|
<Button.Group>
|
||||||
|
<ToggleButtonDesktop />
|
||||||
|
{enabled && <AddElementAction type="button" />}
|
||||||
|
</Button.Group>
|
||||||
|
) : (
|
||||||
|
<ToggleButtonDesktop />
|
||||||
)}
|
)}
|
||||||
</Popover.Target>
|
</Popover.Target>
|
||||||
|
|
||||||
<Popover.Dropdown p={4} px={6}>
|
<Popover.Dropdown p={4} px={6}>
|
||||||
<div style={{ position: 'absolute', top: 2, right: 2 }}>
|
<div style={{ position: 'absolute', top: 2, right: 2 }}>
|
||||||
<ActionIcon onClick={() => setPopoverManuallyHidden(true)}>
|
<ActionIcon onClick={() => setPopoverManuallyHidden(true)}>
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ export function Header(props: any) {
|
|||||||
</Box>
|
</Box>
|
||||||
<Group position="right" style={{ maxWidth: 'none' }} noWrap>
|
<Group position="right" style={{ maxWidth: 'none' }} noWrap>
|
||||||
<Search />
|
<Search />
|
||||||
<AddElementAction />
|
|
||||||
<ToggleEditModeAction />
|
<ToggleEditModeAction />
|
||||||
<DockerMenuButton />
|
<DockerMenuButton />
|
||||||
<Indicator size={15} color="blue" withBorder processing disabled={!newVersionAvailable}>
|
<Indicator size={15} color="blue" withBorder processing disabled={!newVersionAvailable}>
|
||||||
|
|||||||
Reference in New Issue
Block a user