diff --git a/frontend/src/components/ComposeDiffPreviewDialog.tsx b/frontend/src/components/ComposeDiffPreviewDialog.tsx index 8f0f03a2..d6d788b6 100644 --- a/frontend/src/components/ComposeDiffPreviewDialog.tsx +++ b/frontend/src/components/ComposeDiffPreviewDialog.tsx @@ -1,8 +1,8 @@ import { Suspense } from 'react'; import { DiffEditor } from '@/lib/monacoLoader'; -import { Loader2 } from 'lucide-react'; import { Modal, ModalHeader, ModalFooter } from '@/components/ui/modal'; import { Button } from '@/components/ui/button'; +import { BusyButton } from '@/components/ui/busy-button'; import type { ComposeDiffActionLabel } from '@/components/resolveComposeDiffActionLabel'; export interface ComposeDiffPreviewDialogProps { @@ -75,16 +75,13 @@ export function ComposeDiffPreviewDialog({ } primary={ - + } /> diff --git a/frontend/src/components/EditorLayout.tsx b/frontend/src/components/EditorLayout.tsx index 8c73458b..10be5d72 100644 --- a/frontend/src/components/EditorLayout.tsx +++ b/frontend/src/components/EditorLayout.tsx @@ -1056,6 +1056,8 @@ export default function EditorLayout() { void; stackName: string | null; onConfirm: (pruneVolumes: boolean) => void | Promise; + /** True while the stack delete request owns the flow (from stackActionMap). */ + confirming?: boolean; } -export function DeleteStackDialog({ open, onOpenChange, stackName, onConfirm }: DeleteStackDialogProps) { +export function DeleteStackDialog({ + open, + onOpenChange, + stackName, + onConfirm, + confirming = false, +}: DeleteStackDialogProps) { const [pruneVolumes, setPruneVolumes] = useState(false); const handleOpenChange = (next: boolean) => { @@ -42,6 +50,8 @@ export function DeleteStackDialog({ open, onOpenChange, stackName, onConfirm }: description={`Confirm deletion of ${stackName ?? 'stack'}.`} hint={pruneVolumes ? 'VOLUMES PRUNED' : 'VOLUMES KEPT'} confirmLabel="Delete" + busyConfirmLabel="Deleting..." + confirming={confirming} onConfirm={() => onConfirm(pruneVolumes)} >

This action cannot be undone.

@@ -49,6 +59,7 @@ export function DeleteStackDialog({ open, onOpenChange, stackName, onConfirm }: setPruneVolumes(v === true)} />