mirror of
https://github.com/Unleash/unleash.git
synced 2025-05-17 01:17:29 +02:00
fix: delete project segment with change request (#9315)
This commit is contained in:
parent
3f730bb7f3
commit
b207606800
@ -59,6 +59,10 @@ export const SegmentChangeDetails: FC<{
|
|||||||
}> = ({ actions, change, changeRequestState }) => {
|
}> = ({ actions, change, changeRequestState }) => {
|
||||||
const { segment: currentSegment } = useSegment(change.payload.id);
|
const { segment: currentSegment } = useSegment(change.payload.id);
|
||||||
const snapshotSegment = change.payload.snapshot;
|
const snapshotSegment = change.payload.snapshot;
|
||||||
|
const previousName =
|
||||||
|
changeRequestState === 'Applied'
|
||||||
|
? change.payload?.snapshot?.name
|
||||||
|
: currentSegment?.name;
|
||||||
const referenceSegment =
|
const referenceSegment =
|
||||||
changeRequestState === 'Applied' ? snapshotSegment : currentSegment;
|
changeRequestState === 'Applied' ? snapshotSegment : currentSegment;
|
||||||
|
|
||||||
@ -74,10 +78,13 @@ export const SegmentChangeDetails: FC<{
|
|||||||
>
|
>
|
||||||
- Deleting segment:
|
- Deleting segment:
|
||||||
</Typography>
|
</Typography>
|
||||||
<SegmentTooltipLink change={change}>
|
<SegmentTooltipLink
|
||||||
|
name={change.payload.name}
|
||||||
|
previousName={previousName}
|
||||||
|
>
|
||||||
<SegmentDiff
|
<SegmentDiff
|
||||||
change={change}
|
change={change}
|
||||||
currentSegment={currentSegment}
|
currentSegment={referenceSegment}
|
||||||
/>
|
/>
|
||||||
</SegmentTooltipLink>
|
</SegmentTooltipLink>
|
||||||
</ChangeItemInfo>
|
</ChangeItemInfo>
|
||||||
@ -97,7 +104,7 @@ export const SegmentChangeDetails: FC<{
|
|||||||
<ChangeItemCreateEditWrapper>
|
<ChangeItemCreateEditWrapper>
|
||||||
<ChangeItemInfo>
|
<ChangeItemInfo>
|
||||||
<Typography>Editing segment:</Typography>
|
<Typography>Editing segment:</Typography>
|
||||||
<SegmentTooltipLink change={change}>
|
<SegmentTooltipLink name={change.payload.name}>
|
||||||
<SegmentDiff
|
<SegmentDiff
|
||||||
change={change}
|
change={change}
|
||||||
currentSegment={referenceSegment}
|
currentSegment={referenceSegment}
|
||||||
|
@ -42,8 +42,9 @@ export const SegmentDiff: FC<{
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
interface IStrategyTooltipLinkProps {
|
interface IStrategyTooltipLinkProps {
|
||||||
change: IChangeRequestUpdateSegment | IChangeRequestDeleteSegment;
|
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
|
name?: string;
|
||||||
|
previousName?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const StyledContainer: FC<{ children?: React.ReactNode }> = styled('div')(
|
const StyledContainer: FC<{ children?: React.ReactNode }> = styled('div')(
|
||||||
@ -68,15 +69,13 @@ const Truncated = styled('div')(() => ({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
export const SegmentTooltipLink: FC<IStrategyTooltipLinkProps> = ({
|
export const SegmentTooltipLink: FC<IStrategyTooltipLinkProps> = ({
|
||||||
change,
|
name,
|
||||||
|
previousName,
|
||||||
children,
|
children,
|
||||||
}) => (
|
}) => (
|
||||||
<StyledContainer>
|
<StyledContainer>
|
||||||
<Truncated>
|
<Truncated>
|
||||||
<NameWithChangeInfo
|
<NameWithChangeInfo previousName={previousName} newName={name} />
|
||||||
previousName={change.name}
|
|
||||||
newName={change.payload.name}
|
|
||||||
/>
|
|
||||||
<TooltipLink
|
<TooltipLink
|
||||||
tooltip={children}
|
tooltip={children}
|
||||||
tooltipProps={{
|
tooltipProps={{
|
||||||
|
@ -14,6 +14,8 @@ import { useSegmentsApi } from 'hooks/api/actions/useSegmentsApi/useSegmentsApi'
|
|||||||
import { formatUnknownError } from 'utils/formatUnknownError';
|
import { formatUnknownError } from 'utils/formatUnknownError';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useOptionalPathParam } from 'hooks/useOptionalPathParam';
|
import { useOptionalPathParam } from 'hooks/useOptionalPathParam';
|
||||||
|
import { useHighestPermissionChangeRequestEnvironment } from 'hooks/useHighestPermissionChangeRequestEnvironment';
|
||||||
|
import { useChangeRequestApi } from 'hooks/api/actions/useChangeRequestApi/useChangeRequestApi';
|
||||||
|
|
||||||
interface IRemoveSegmentButtonProps {
|
interface IRemoveSegmentButtonProps {
|
||||||
segment: ISegment;
|
segment: ISegment;
|
||||||
@ -25,14 +27,29 @@ export const RemoveSegmentButton = ({ segment }: IRemoveSegmentButtonProps) => {
|
|||||||
const { deleteSegment } = useSegmentsApi();
|
const { deleteSegment } = useSegmentsApi();
|
||||||
const { setToastData, setToastApiError } = useToast();
|
const { setToastData, setToastApiError } = useToast();
|
||||||
const [showModal, toggleModal] = useState(false);
|
const [showModal, toggleModal] = useState(false);
|
||||||
|
const highestPermissionChangeRequestEnv =
|
||||||
|
useHighestPermissionChangeRequestEnvironment(segment?.project);
|
||||||
|
const changeRequestEnv = highestPermissionChangeRequestEnv();
|
||||||
|
const { addChange } = useChangeRequestApi();
|
||||||
|
|
||||||
const onRemove = async () => {
|
const onRemove = async () => {
|
||||||
try {
|
try {
|
||||||
|
if (changeRequestEnv && segment.project) {
|
||||||
|
await addChange(segment.project, changeRequestEnv, {
|
||||||
|
action: 'deleteSegment',
|
||||||
|
feature: null,
|
||||||
|
payload: { id: segment.id },
|
||||||
|
});
|
||||||
|
} else {
|
||||||
await deleteSegment(segment.id);
|
await deleteSegment(segment.id);
|
||||||
|
}
|
||||||
|
|
||||||
await refetchSegments();
|
await refetchSegments();
|
||||||
setToastData({
|
setToastData({
|
||||||
|
text: `Segment ${
|
||||||
|
changeRequestEnv ? 'change added to draft' : 'deleted'
|
||||||
|
}`,
|
||||||
type: 'success',
|
type: 'success',
|
||||||
text: 'Segment deleted',
|
|
||||||
});
|
});
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
setToastApiError(formatUnknownError(error));
|
setToastApiError(formatUnknownError(error));
|
||||||
@ -60,6 +77,7 @@ export const RemoveSegmentButton = ({ segment }: IRemoveSegmentButtonProps) => {
|
|||||||
open={showModal}
|
open={showModal}
|
||||||
onClose={() => toggleModal(false)}
|
onClose={() => toggleModal(false)}
|
||||||
onRemove={onRemove}
|
onRemove={onRemove}
|
||||||
|
title={changeRequestEnv ? 'Add to draft' : 'Save'}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
@ -9,6 +9,7 @@ interface ISegmentDeleteProps {
|
|||||||
open: boolean;
|
open: boolean;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
onRemove: () => void;
|
onRemove: () => void;
|
||||||
|
title: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SegmentDelete = ({
|
export const SegmentDelete = ({
|
||||||
@ -16,6 +17,7 @@ export const SegmentDelete = ({
|
|||||||
open,
|
open,
|
||||||
onClose,
|
onClose,
|
||||||
onRemove,
|
onRemove,
|
||||||
|
title,
|
||||||
}: ISegmentDeleteProps) => {
|
}: ISegmentDeleteProps) => {
|
||||||
const { strategies, changeRequestStrategies, loading } =
|
const { strategies, changeRequestStrategies, loading } =
|
||||||
useStrategiesBySegment(segment.id);
|
useStrategiesBySegment(segment.id);
|
||||||
@ -34,6 +36,7 @@ export const SegmentDelete = ({
|
|||||||
open={open}
|
open={open}
|
||||||
onClose={onClose}
|
onClose={onClose}
|
||||||
onRemove={onRemove}
|
onRemove={onRemove}
|
||||||
|
title={title}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
elseShow={
|
elseShow={
|
||||||
|
@ -15,6 +15,7 @@ interface ISegmentDeleteConfirmProps {
|
|||||||
open: boolean;
|
open: boolean;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
onRemove: () => void;
|
onRemove: () => void;
|
||||||
|
title: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SegmentDeleteConfirm = ({
|
export const SegmentDeleteConfirm = ({
|
||||||
@ -22,6 +23,7 @@ export const SegmentDeleteConfirm = ({
|
|||||||
open,
|
open,
|
||||||
onClose,
|
onClose,
|
||||||
onRemove,
|
onRemove,
|
||||||
|
title,
|
||||||
}: ISegmentDeleteConfirmProps) => {
|
}: ISegmentDeleteConfirmProps) => {
|
||||||
const [confirmName, setConfirmName] = useState('');
|
const [confirmName, setConfirmName] = useState('');
|
||||||
|
|
||||||
@ -37,7 +39,7 @@ export const SegmentDeleteConfirm = ({
|
|||||||
<Dialogue
|
<Dialogue
|
||||||
title='Are you sure you want to delete this segment?'
|
title='Are you sure you want to delete this segment?'
|
||||||
open={open}
|
open={open}
|
||||||
primaryButtonText='Delete segment'
|
primaryButtonText={title}
|
||||||
secondaryButtonText='Cancel'
|
secondaryButtonText='Cancel'
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
onRemove();
|
onRemove();
|
||||||
|
@ -16,6 +16,7 @@ export interface IChangeSchema {
|
|||||||
| 'reorderStrategy'
|
| 'reorderStrategy'
|
||||||
| 'archiveFeature'
|
| 'archiveFeature'
|
||||||
| 'updateSegment'
|
| 'updateSegment'
|
||||||
|
| 'deleteSegment'
|
||||||
| 'addDependency'
|
| 'addDependency'
|
||||||
| 'deleteDependency'
|
| 'deleteDependency'
|
||||||
| 'addReleasePlan'
|
| 'addReleasePlan'
|
||||||
|
Loading…
Reference in New Issue
Block a user