1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-10-04 11:17:02 +02:00
unleash.unleash/frontend/src/component/changeRequest/ChangeRequest/Changes/Change/SegmentChangeDetails.tsx
Thomas Heartman e516bbf14c
chore: renames "Change" tab to "View change" to align with "View diff". (#10314)
There was some confusion whether the options were related or not. This
is a quick and easy solution that may solve the problem. If it doesn't,
we can make further changes later.

<img width="1045" alt="image"
src="https://github.com/user-attachments/assets/6b186b24-c4a7-491b-acbf-0e022a94493c"
/>
2025-07-04 13:32:46 +02:00

130 lines
4.9 KiB
TypeScript

import type { FC, ReactNode } from 'react';
import { Box, styled } from '@mui/material';
import type {
ChangeRequestState,
IChangeRequestDeleteSegment,
IChangeRequestUpdateSegment,
} from 'component/changeRequest/changeRequest.types';
import { useSegment } from 'hooks/api/getters/useSegment/useSegment';
import { ViewableConstraintsList } from 'component/common/NewConstraintAccordion/ConstraintsList/ViewableConstraintsList';
import { ChangeOverwriteWarning } from './ChangeOverwriteWarning/ChangeOverwriteWarning.tsx';
import { Tab, TabList, TabPanel, Tabs } from './ChangeTabComponents.tsx';
import {
Action,
ChangeItemInfo,
ChangeItemWrapper,
Deleted,
} from './Change.styles.tsx';
import { SegmentDiff } from './SegmentDiff.tsx';
import { NameWithChangeInfo } from './NameWithChangeInfo/NameWithChangeInfo.tsx';
const ActionsContainer = styled('div')(({ theme }) => ({
display: 'flex',
flexFlow: 'row wrap',
alignItems: 'center',
columnGap: theme.spacing(1),
}));
const SegmentContainer = styled(Box, {
shouldForwardProp: (prop) => prop !== 'conflict',
})<{ conflict: string | undefined }>(({ theme, conflict }) => ({
display: 'flex',
flexFlow: 'column',
gap: theme.spacing(1),
border: `1px solid ${
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 = (
<ActionsContainer>
<TabList>
<Tab>View change</Tab>
<Tab>View diff</Tab>
</TabList>
{actions}
</ActionsContainer>
);
return (
<Tabs>
<SegmentContainer conflict={change.conflict}>
{change.action === 'deleteSegment' && (
<>
<ChangeItemWrapper>
<ChangeItemInfo>
<Deleted>Deleting segment</Deleted>
<NameWithChangeInfo
newName={change.payload.name}
previousName={previousName}
/>
</ChangeItemInfo>
{actionsWithTabs}
</ChangeItemWrapper>
<TabPanel sx={{ display: 'contents' }} />
<TabPanel sx={{ mt: 1 }} variant='diff'>
<SegmentDiff
change={change}
currentSegment={referenceSegment}
/>
</TabPanel>
</>
)}
{change.action === 'updateSegment' && (
<>
<ChangeOverwriteWarning
data={{
current: currentSegment,
change,
changeType: 'segment',
}}
changeRequestState={changeRequestState}
/>
<ChangeItemWrapper>
<ChangeItemInfo>
<Action>Editing segment</Action>
<NameWithChangeInfo
newName={change.payload.name}
previousName={previousName}
/>
</ChangeItemInfo>
{actionsWithTabs}
</ChangeItemWrapper>
<TabPanel>
<ViewableConstraintsList
constraints={change.payload.constraints}
/>
</TabPanel>
<TabPanel variant='diff'>
<SegmentDiff
change={change}
currentSegment={referenceSegment}
/>
</TabPanel>
</>
)}
</SegmentContainer>
</Tabs>
);
};