in src/components/StepSeparator/SeparatorActions.tsx [59:154]
export function SeparatorActions({
canDelete,
index,
isDraggable,
showControls,
step,
}: ISeparatorActions) {
const [isGrabbing, setIsGrabbing] = useState<boolean | null>(
isDraggable === null ? isDraggable : false
);
const { setDragIndex } = useContext(DragAndDropContext);
const { onMergeSteps, setStepName } = useContext(StepsContext);
const [showEditButton, setShowEditButton] = useState(true);
const [showDeleteButton, setShowDeleteButton] = useState(true);
const [isEditingName, setIsEditingName] = useState(false);
const dragParams: IDragProps = {};
if (isDraggable) {
dragParams.onDragStart = e => {
setDragIndex(index);
setShowDeleteButton(false);
setShowEditButton(false);
const dragDataString = JSON.stringify(createStepSeparatorDragDropData(index));
e.dataTransfer.setData(DRAG_AND_DROP_DATA_TRANSFER_TYPE, dragDataString);
e.dataTransfer.setData('text/plain', dragDataString);
};
dragParams.onDragEnd = () => {
setShowDeleteButton(true);
setShowEditButton(true);
setDragIndex(undefined);
setIsGrabbing(false);
};
}
const defaultStepName = `Step ${index + 1}`;
const stepHeadingText = step.name ?? defaultStepName;
return (
<ControlsWrapper
alignItems="center"
aria-label="Drag to reorganize steps"
draggable={!!isDraggable}
gutterSize="s"
isGrabbing={isGrabbing}
onMouseDown={() => setIsGrabbing(true)}
onMouseUp={() => setIsGrabbing(false)}
{...dragParams}
>
{!isEditingName && (
<StepSeparatorHeading id={`step-${index}`} grow={false}>
{stepHeadingText}
</StepSeparatorHeading>
)}
{isEditingName && (
<EditStepNameInput
placeholder={defaultStepName}
defaultValue={step.name}
onComplete={(value?: string | null) => {
setIsEditingName(false);
setShowEditButton(true);
if (value !== null) {
setStepName(index, value);
}
}}
/>
)}
{showEditButton && (
<EuiFlexItem grow={false} style={{ visibility: showControls ? 'visible' : 'hidden' }}>
<EuiToolTip content="Edit step name">
<EuiButtonIcon
aria-label="Rename step"
color="text"
iconType="pencil"
onClick={() => {
setIsEditingName(true);
setShowEditButton(false);
}}
/>
</EuiToolTip>
</EuiFlexItem>
)}
{index > 0 && canDelete && showDeleteButton && !isEditingName && (
<EuiFlexItem grow={false}>
<EuiToolTip content="Delete this step divider">
<DeleteButton
aria-label="Delete step"
color="text"
disabled={!canDelete}
iconType="trash"
isVisible={showControls}
onClick={() => onMergeSteps(index - 1, index)}
/>
</EuiToolTip>
</EuiFlexItem>
)}
{!isEditingName && <StepSeparatorTopBorder />}
</ControlsWrapper>
);
}