mirror of
https://github.com/Unleash/unleash.git
synced 2025-10-13 11:17:26 +02:00
Adds change / view diff tab buttons to segment changes too. Extracts the tab definitions and stylings into its own file so that it's easier to share across CR change components. Moves the old segment change details into the legacy segment change file. Change views: <img width="999" alt="image" src="https://github.com/user-attachments/assets/26e2a987-f582-449d-b61c-bf2ec5c1edd4" /> Diff views: <img width="1011" alt="image" src="https://github.com/user-attachments/assets/95621234-1352-4164-8f74-775bdb0e61dd" />
156 lines
5.8 KiB
TypeScript
156 lines
5.8 KiB
TypeScript
import type React from 'react';
|
|
import type { FC, ReactNode } from 'react';
|
|
import { Box, styled, Typography } from '@mui/material';
|
|
import type {
|
|
ChangeRequestState,
|
|
IChangeRequestDeleteSegment,
|
|
IChangeRequestUpdateSegment,
|
|
} from 'component/changeRequest/changeRequest.types';
|
|
import { useSegment } from 'hooks/api/getters/useSegment/useSegment';
|
|
import { SegmentDiff, SegmentTooltipLink } from '../../SegmentTooltipLink.tsx';
|
|
import { ViewableConstraintsList } from 'component/common/NewConstraintAccordion/ConstraintsList/ViewableConstraintsList';
|
|
|
|
import { ChangeOverwriteWarning } from './ChangeOverwriteWarning/ChangeOverwriteWarning.tsx';
|
|
import { Tab, TabList, TabPanel, Tabs } from './ChangeTabComponents.tsx';
|
|
|
|
const ChangeItemCreateEditWrapper = styled(Box)(({ theme }) => ({
|
|
display: 'flex',
|
|
gap: theme.spacing(1),
|
|
alignItems: 'center',
|
|
width: '100%',
|
|
margin: theme.spacing(0, 0, 1, 0),
|
|
}));
|
|
|
|
export const ChangeItemWrapper = styled(Box)({
|
|
display: 'flex',
|
|
justifyContent: 'space-between',
|
|
alignItems: 'center',
|
|
});
|
|
|
|
const ChangeItemInfo: FC<{ children?: React.ReactNode }> = styled(Box)(
|
|
({ theme }) => ({
|
|
display: 'grid',
|
|
gridTemplateColumns: '150px auto',
|
|
gridAutoFlow: 'column',
|
|
alignItems: 'center',
|
|
flexGrow: 1,
|
|
gap: theme.spacing(1),
|
|
}),
|
|
);
|
|
|
|
const SegmentContainer = styled(Box, {
|
|
shouldForwardProp: (prop) => prop !== 'conflict',
|
|
})<{ conflict: string | undefined }>(({ theme, conflict }) => ({
|
|
borderLeft: '1px solid',
|
|
borderRight: '1px solid',
|
|
borderTop: '1px solid',
|
|
borderBottom: '1px solid',
|
|
borderColor: conflict
|
|
? theme.palette.warning.border
|
|
: theme.palette.divider,
|
|
borderTopColor: theme.palette.divider,
|
|
padding: theme.spacing(3),
|
|
borderRadius: `0 0 ${theme.shape.borderRadiusLarge}px ${theme.shape.borderRadiusLarge}px`,
|
|
}));
|
|
|
|
export const SegmentChangeDetails: FC<{
|
|
actions?: ReactNode;
|
|
change: IChangeRequestUpdateSegment | IChangeRequestDeleteSegment;
|
|
changeRequestState: ChangeRequestState;
|
|
}> = ({ actions, change, changeRequestState }) => {
|
|
const { segment: currentSegment } = useSegment(change.payload.id);
|
|
const snapshotSegment = change.payload.snapshot;
|
|
const previousName =
|
|
changeRequestState === 'Applied'
|
|
? change.payload?.snapshot?.name
|
|
: currentSegment?.name;
|
|
const referenceSegment =
|
|
changeRequestState === 'Applied' ? snapshotSegment : currentSegment;
|
|
|
|
const actionsWithTabs = (
|
|
<>
|
|
<TabList>
|
|
<Tab>Change</Tab>
|
|
<Tab>View diff</Tab>
|
|
</TabList>
|
|
{actions}
|
|
</>
|
|
);
|
|
|
|
return (
|
|
<Tabs>
|
|
<SegmentContainer conflict={change.conflict}>
|
|
{change.action === 'deleteSegment' && (
|
|
<>
|
|
<ChangeItemWrapper>
|
|
<ChangeItemInfo>
|
|
<Typography
|
|
sx={(theme) => ({
|
|
color: theme.palette.error.main,
|
|
})}
|
|
>
|
|
- Deleting segment:
|
|
</Typography>
|
|
<SegmentTooltipLink
|
|
name={change.payload.name}
|
|
previousName={previousName}
|
|
>
|
|
<SegmentDiff
|
|
change={change}
|
|
currentSegment={referenceSegment}
|
|
/>
|
|
</SegmentTooltipLink>
|
|
</ChangeItemInfo>
|
|
{actionsWithTabs}
|
|
</ChangeItemWrapper>
|
|
|
|
<TabPanel />
|
|
<TabPanel>
|
|
<SegmentDiff
|
|
change={change}
|
|
currentSegment={referenceSegment}
|
|
/>
|
|
</TabPanel>
|
|
</>
|
|
)}
|
|
{change.action === 'updateSegment' && (
|
|
<>
|
|
<ChangeOverwriteWarning
|
|
data={{
|
|
current: currentSegment,
|
|
change,
|
|
changeType: 'segment',
|
|
}}
|
|
changeRequestState={changeRequestState}
|
|
/>
|
|
<ChangeItemCreateEditWrapper>
|
|
<ChangeItemInfo>
|
|
<Typography>Editing segment:</Typography>
|
|
<SegmentTooltipLink name={change.payload.name}>
|
|
<SegmentDiff
|
|
change={change}
|
|
currentSegment={referenceSegment}
|
|
/>
|
|
</SegmentTooltipLink>
|
|
</ChangeItemInfo>
|
|
{actionsWithTabs}
|
|
</ChangeItemCreateEditWrapper>
|
|
|
|
<TabPanel>
|
|
<ViewableConstraintsList
|
|
constraints={change.payload.constraints}
|
|
/>
|
|
</TabPanel>
|
|
<TabPanel>
|
|
<SegmentDiff
|
|
change={change}
|
|
currentSegment={referenceSegment}
|
|
/>
|
|
</TabPanel>
|
|
</>
|
|
)}
|
|
</SegmentContainer>
|
|
</Tabs>
|
|
);
|
|
};
|