mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01: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