💄 Improve edit mode UX

This commit is contained in:
Manuel Ruwe
2023-01-01 17:26:09 +01:00
parent f23c317ef1
commit aa31824169
3 changed files with 101 additions and 45 deletions

View File

@@ -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;
}
}; };

View File

@@ -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)}>

View File

@@ -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}>