From 89bf302efdcfd179b0502427f1ffb2332c2e3399 Mon Sep 17 00:00:00 2001 From: joshistoast Date: Wed, 4 Mar 2026 15:00:39 -0700 Subject: [PATCH] feat(model manager queue): reorganize bulk actions --- .../ModelInstallQueue/ModelInstallQueue.tsx | 97 +++++++++++++------ 1 file changed, 68 insertions(+), 29 deletions(-) diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx index f399ada862..7d24585bfb 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/ModelInstallQueue/ModelInstallQueue.tsx @@ -2,7 +2,6 @@ import type { SystemStyleObject } from '@invoke-ai/ui-library'; import { Box, Button, - ButtonGroup, Flex, Heading, IconButton, @@ -202,8 +201,6 @@ export const ModelInstallQueue = memo(() => { const hasPauseableInstalls = pauseableInstallIds.length > 0; const hasResumableInstalls = resumableInstallIds.length > 0; const hasCancelableInstalls = cancelableInstallIds.length > 0; - const showResumeAll = !hasPauseableInstalls && hasResumableInstalls; - const pauseResumeAvailable = hasPauseableInstalls || hasResumableInstalls; const pruneAvailable = useMemo(() => { return data?.some( @@ -211,16 +208,25 @@ export const ModelInstallQueue = memo(() => { ); }, [data]); - const pauseResumeLabel = showResumeAll ? t('modelManager.resumeAll') : t('modelManager.pauseAll'); - - const pauseOrResumeAll = useCallback(() => { - if (showResumeAll) { - void runBulkAction('resume', resumableInstallIds); - return; + const isPrunePriority = useMemo(() => { + if (!pruneAvailable) { + return false; } + if (hasCancelableInstalls) { + return false; + } + + return true; + }, [pruneAvailable, hasCancelableInstalls]); + + const pauseAll = useCallback(() => { void runBulkAction('pause', pauseableInstallIds); - }, [pauseableInstallIds, resumableInstallIds, runBulkAction, showResumeAll]); + }, [pauseableInstallIds, runBulkAction]); + + const resumeAll = useCallback(() => { + void runBulkAction('resume', resumableInstallIds); + }, [resumableInstallIds, runBulkAction]); const cancelAll = useCallback(() => { void runBulkAction('cancel', cancelableInstallIds); @@ -237,37 +243,70 @@ export const ModelInstallQueue = memo(() => { {/* Bulk Actions */} - - + {/* Non-destructive, easily-ccessible actions */} + + {hasPauseableInstalls && ( + + )} + + {hasResumableInstalls && ( + + )} + + {/* When no other actions, offer to prune */} + {isPrunePriority && ( + + )} + + {/* Destructive Actions go to the dropdown menu */} } /> + {!isPrunePriority && ( + } + isDisabled={!pruneAvailable || isBulkActionRunning || isPruning} + onClick={pruneCompletedModelInstalls} + > + {t('modelManager.prune')} + + )} : } - isDisabled={!pauseResumeAvailable || isBulkActionRunning || isPruning} - onClick={pauseOrResumeAll} - > - {pauseResumeLabel} - - } isDisabled={!hasCancelableInstalls || isBulkActionRunning || isPruning} onClick={cancelAll} + isDestructive > {t('modelManager.cancelAll')} - + {/* Model Queue List */}