mirror of
https://github.com/Unleash/unleash.git
synced 2025-07-31 13:47:02 +02:00
ui tweaks (#2557)
This commit is contained in:
parent
1a19d1e6fb
commit
840510a720
@ -1,12 +1,23 @@
|
|||||||
import { VFC } from 'react';
|
import React, { FC, VFC } from 'react';
|
||||||
import { Alert, Box, styled } from '@mui/material';
|
import {
|
||||||
|
Alert,
|
||||||
|
Box,
|
||||||
|
Popover,
|
||||||
|
styled,
|
||||||
|
Tooltip,
|
||||||
|
Typography,
|
||||||
|
} from '@mui/material';
|
||||||
import { ChangeRequestFeatureToggleChange } from '../ChangeRequestOverview/ChangeRequestFeatureToggleChange/ChangeRequestFeatureToggleChange';
|
import { ChangeRequestFeatureToggleChange } from '../ChangeRequestOverview/ChangeRequestFeatureToggleChange/ChangeRequestFeatureToggleChange';
|
||||||
import { objectId } from 'utils/objectId';
|
import { objectId } from 'utils/objectId';
|
||||||
import { ToggleStatusChange } from '../ChangeRequestOverview/ChangeRequestFeatureToggleChange/ToggleStatusChange';
|
import { ToggleStatusChange } from '../ChangeRequestOverview/ChangeRequestFeatureToggleChange/ToggleStatusChange';
|
||||||
import { useChangeRequestApi } from 'hooks/api/actions/useChangeRequestApi/useChangeRequestApi';
|
import { useChangeRequestApi } from 'hooks/api/actions/useChangeRequestApi/useChangeRequestApi';
|
||||||
import { formatUnknownError } from 'utils/formatUnknownError';
|
import { formatUnknownError } from 'utils/formatUnknownError';
|
||||||
import useToast from 'hooks/useToast';
|
import useToast from 'hooks/useToast';
|
||||||
import type { IChangeRequest } from '../changeRequest.types';
|
import type {
|
||||||
|
IChangeRequest,
|
||||||
|
IChangeRequestDeleteStrategy,
|
||||||
|
IChangeRequestUpdateStrategy,
|
||||||
|
} from '../changeRequest.types';
|
||||||
import {
|
import {
|
||||||
Discard,
|
Discard,
|
||||||
StrategyAddedChange,
|
StrategyAddedChange,
|
||||||
@ -17,9 +28,13 @@ import {
|
|||||||
formatStrategyName,
|
formatStrategyName,
|
||||||
GetFeatureStrategyIcon,
|
GetFeatureStrategyIcon,
|
||||||
} from 'utils/strategyNames';
|
} from 'utils/strategyNames';
|
||||||
import { hasNameField } from '../changeRequest.types';
|
import {
|
||||||
|
hasNameField,
|
||||||
|
IChangeRequestAddStrategy,
|
||||||
|
} from '../changeRequest.types';
|
||||||
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
|
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
|
||||||
import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled';
|
import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled';
|
||||||
|
import EventDiff from '../../events/EventDiff/EventDiff';
|
||||||
|
|
||||||
interface IChangeRequestProps {
|
interface IChangeRequestProps {
|
||||||
changeRequest: IChangeRequest;
|
changeRequest: IChangeRequest;
|
||||||
@ -69,6 +84,64 @@ const StyledAlert = styled(Alert)(({ theme }) => ({
|
|||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
const CodeSnippetPopover: FC<{
|
||||||
|
change:
|
||||||
|
| IChangeRequestAddStrategy
|
||||||
|
| IChangeRequestUpdateStrategy
|
||||||
|
| IChangeRequestDeleteStrategy;
|
||||||
|
}> = ({ change }) => {
|
||||||
|
const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);
|
||||||
|
|
||||||
|
const handlePopoverOpen = (event: React.MouseEvent<HTMLElement>) => {
|
||||||
|
setAnchorEl(event.currentTarget);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handlePopoverClose = () => {
|
||||||
|
setAnchorEl(null);
|
||||||
|
};
|
||||||
|
|
||||||
|
const open = Boolean(anchorEl);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<GetFeatureStrategyIcon strategyName={change.payload.name} />
|
||||||
|
|
||||||
|
<Typography
|
||||||
|
onMouseEnter={handlePopoverOpen}
|
||||||
|
onMouseLeave={handlePopoverClose}
|
||||||
|
>
|
||||||
|
{formatStrategyName(change.payload.name)}
|
||||||
|
</Typography>
|
||||||
|
<Popover
|
||||||
|
id={String(change.id)}
|
||||||
|
sx={{
|
||||||
|
pointerEvents: 'none',
|
||||||
|
}}
|
||||||
|
open={open}
|
||||||
|
anchorEl={anchorEl}
|
||||||
|
anchorOrigin={{
|
||||||
|
vertical: 'bottom',
|
||||||
|
horizontal: 'left',
|
||||||
|
}}
|
||||||
|
transformOrigin={{
|
||||||
|
vertical: 'top',
|
||||||
|
horizontal: 'left',
|
||||||
|
}}
|
||||||
|
onClose={handlePopoverClose}
|
||||||
|
disableRestoreFocus
|
||||||
|
>
|
||||||
|
<Box sx={{ paddingLeft: 3, paddingRight: 3 }}>
|
||||||
|
<EventDiff
|
||||||
|
entry={{
|
||||||
|
data: change.payload,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Popover>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export const ChangeRequest: VFC<IChangeRequestProps> = ({
|
export const ChangeRequest: VFC<IChangeRequestProps> = ({
|
||||||
changeRequest,
|
changeRequest,
|
||||||
onRefetch,
|
onRefetch,
|
||||||
@ -173,13 +246,7 @@ export const ChangeRequest: VFC<IChangeRequestProps> = ({
|
|||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<GetFeatureStrategyIcon
|
<CodeSnippetPopover change={change} />
|
||||||
strategyName={change.payload.name}
|
|
||||||
/>
|
|
||||||
|
|
||||||
{formatStrategyName(
|
|
||||||
change.payload.name
|
|
||||||
)}
|
|
||||||
</StrategyAddedChange>
|
</StrategyAddedChange>
|
||||||
)}
|
)}
|
||||||
{change.action === 'deleteStrategy' && (
|
{change.action === 'deleteStrategy' && (
|
||||||
@ -198,16 +265,9 @@ export const ChangeRequest: VFC<IChangeRequestProps> = ({
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
{hasNameField(change.payload) && (
|
{hasNameField(change.payload) && (
|
||||||
<>
|
<CodeSnippetPopover
|
||||||
<GetFeatureStrategyIcon
|
change={change}
|
||||||
strategyName={
|
/>
|
||||||
change.payload.name
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
{formatStrategyName(
|
|
||||||
change.payload.name
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
)}
|
)}
|
||||||
</StrategyDeletedChange>
|
</StrategyDeletedChange>
|
||||||
)}
|
)}
|
||||||
@ -226,12 +286,7 @@ export const ChangeRequest: VFC<IChangeRequestProps> = ({
|
|||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<GetFeatureStrategyIcon
|
<CodeSnippetPopover change={change} />
|
||||||
strategyName={change.payload.name}
|
|
||||||
/>
|
|
||||||
{formatStrategyName(
|
|
||||||
change.payload.name
|
|
||||||
)}
|
|
||||||
</StrategyEditedChange>
|
</StrategyEditedChange>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
@ -61,7 +61,7 @@ export const ChangeRequestFeatureToggleChange: FC<
|
|||||||
px: 3,
|
px: 3,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ToggleOnIcon color="disabled" />
|
<Typography>Feature toggle name: </Typography>
|
||||||
<Typography
|
<Typography
|
||||||
component={Link}
|
component={Link}
|
||||||
to={`/projects/${projectId}/features/${featureName}`}
|
to={`/projects/${projectId}/features/${featureName}`}
|
||||||
@ -69,7 +69,7 @@ export const ChangeRequestFeatureToggleChange: FC<
|
|||||||
sx={{ textDecoration: 'none', marginLeft: 1 }}
|
sx={{ textDecoration: 'none', marginLeft: 1 }}
|
||||||
onClick={onNavigate}
|
onClick={onNavigate}
|
||||||
>
|
>
|
||||||
{featureName}
|
<strong>{featureName}</strong>
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
|
@ -30,7 +30,7 @@ export const StrategyAddedChange: FC<{ discard?: ReactNode }> = ({
|
|||||||
<ChangeItemWrapper>
|
<ChangeItemWrapper>
|
||||||
<ChangeItemInfo>
|
<ChangeItemInfo>
|
||||||
<Typography
|
<Typography
|
||||||
sx={theme => ({ color: theme.palette.success.main })}
|
sx={theme => ({ color: theme.palette.success.dark })}
|
||||||
>
|
>
|
||||||
+ Adding strategy:
|
+ Adding strategy:
|
||||||
</Typography>
|
</Typography>
|
||||||
|
@ -218,6 +218,7 @@ export const ChangeRequestSidebar: VFC<IChangeRequestSidebarProps> = ({
|
|||||||
key={environmentChangeRequest.id}
|
key={environmentChangeRequest.id}
|
||||||
sx={{
|
sx={{
|
||||||
padding: 2,
|
padding: 2,
|
||||||
|
mt: 2,
|
||||||
border: '2px solid',
|
border: '2px solid',
|
||||||
borderColor: theme => theme.palette.neutral.light,
|
borderColor: theme => theme.palette.neutral.light,
|
||||||
borderRadius: theme =>
|
borderRadius: theme =>
|
||||||
@ -304,7 +305,7 @@ export const ChangeRequestSidebar: VFC<IChangeRequestSidebarProps> = ({
|
|||||||
<StyledSuccessIcon />
|
<StyledSuccessIcon />
|
||||||
<Typography
|
<Typography
|
||||||
color={
|
color={
|
||||||
theme.palette.success.main
|
theme.palette.success.dark
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
Draft successfully sent to
|
Draft successfully sent to
|
||||||
|
@ -28,9 +28,8 @@ const DraftBannerContent: FC<{
|
|||||||
return (
|
return (
|
||||||
<Box className={classes.content}>
|
<Box className={classes.content}>
|
||||||
<DraftBannerContentWrapper>
|
<DraftBannerContentWrapper>
|
||||||
<WarningAmberIcon />
|
<Typography variant="body2">
|
||||||
<Typography variant="body2" sx={{ ml: 1, maxWidth: '500px' }}>
|
<strong>Change request mode</strong> – You have changes{' '}
|
||||||
<strong>Draft mode!</strong> – You have changes{' '}
|
|
||||||
<ConditionallyRender
|
<ConditionallyRender
|
||||||
condition={Boolean(changeRequest.environment)}
|
condition={Boolean(changeRequest.environment)}
|
||||||
show={
|
show={
|
||||||
|
@ -99,6 +99,7 @@ type ChangeRequestEditStrategy = ChangeRequestAddStrategy & { id: string };
|
|||||||
|
|
||||||
type ChangeRequestDeleteStrategy = {
|
type ChangeRequestDeleteStrategy = {
|
||||||
id: string;
|
id: string;
|
||||||
|
name: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ChangeRequestAction =
|
export type ChangeRequestAction =
|
||||||
|
@ -10,7 +10,6 @@ import { formatUnknownError } from 'utils/formatUnknownError';
|
|||||||
import PermissionButton from 'component/common/PermissionButton/PermissionButton';
|
import PermissionButton from 'component/common/PermissionButton/PermissionButton';
|
||||||
import { CREATE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions';
|
import { CREATE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions';
|
||||||
import { IFeatureStrategyPayload } from 'interfaces/strategy';
|
import { IFeatureStrategyPayload } from 'interfaces/strategy';
|
||||||
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
|
|
||||||
|
|
||||||
interface IAddFromTemplateCardProps {
|
interface IAddFromTemplateCardProps {
|
||||||
title: string;
|
title: string;
|
||||||
|
Loading…
Reference in New Issue
Block a user