feat/fix: App mode QA feedback 2 (#9511)

## Summary

Additional fixes and updates based on testing

## Changes

- **What**: 
- add warning to welcome screen & when sharing an app that has had all
outputs removed
- fix target workflow when changing mode via tab right click menu
- change build app text to be conditional "edit" vs "build" depending on
if an app is already defined
- update empty apps sidebar tab button text to make it clearer
- remove templates button from app mode (we will reintroduce this once
we have app templates)
- add "exit to graph" after applying default mode of node graph
- update cancel button to remove item from queue if it hasn't started
yet
- improve scoping of jobs/outputs to the current workflow [not perfect
but should be much improved]
- close sidebar tabs on entering app mode
- change tooltip to be under the workflow menu rather than covering the
button

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9511-feat-fix-App-mode-QA-feedback-2-31b6d73d365081d59bbbc13111100d46)
by [Unito](https://www.unito.io)
This commit is contained in:
pythongosssss
2026-03-07 02:57:03 +00:00
committed by GitHub
parent 8bfd93963f
commit 1058b7d12d
27 changed files with 471 additions and 107 deletions

View File

@@ -7,6 +7,7 @@ import type { NodeId } from '@/lib/litegraph/src/LGraphNode'
import type { LinearData } from '@/platform/workflow/management/stores/comfyWorkflow'
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import { useSidebarTabStore } from '@/stores/workspace/sidebarTabStore'
import { app } from '@/scripts/app'
import { resolveNode } from '@/utils/litegraphUtil'
@@ -26,20 +27,25 @@ export const useAppModeStore = defineStore('appMode', () => {
return !!app.rootGraph?.nodes?.length
})
function loadSelections(data: Partial<LinearData> | undefined) {
// Prune entries referencing nodes deleted in workflow mode.
// Only check node existence, not widgets — dynamic widgets can
// hide/show other widgets so a missing widget does not mean stale data.
function pruneLinearData(data: Partial<LinearData> | undefined): LinearData {
const rawInputs = data?.inputs ?? []
const rawOutputs = data?.outputs ?? []
// Prune entries referencing nodes deleted in workflow mode.
// Only check node existence, not widgets — dynamic widgets can
// hide/show other widgets so a missing widget does not mean stale data.
const inputs = app.rootGraph
? rawInputs.filter(([nodeId]) => resolveNode(nodeId))
: rawInputs
const outputs = app.rootGraph
? rawOutputs.filter((nodeId) => resolveNode(nodeId))
: rawOutputs
return {
inputs: app.rootGraph
? rawInputs.filter(([nodeId]) => resolveNode(nodeId))
: rawInputs,
outputs: app.rootGraph
? rawOutputs.filter((nodeId) => resolveNode(nodeId))
: rawOutputs
}
}
function loadSelections(data: Partial<LinearData> | undefined) {
const { inputs, outputs } = pruneLinearData(data)
selectedInputs.splice(0, selectedInputs.length, ...inputs)
selectedOutputs.splice(0, selectedOutputs.length, ...outputs)
}
@@ -105,6 +111,8 @@ export const useAppModeStore = defineStore('appMode', () => {
return
}
useSidebarTabStore().activeSidebarTabId = null
setMode(
mode.value === 'app' && hasOutputs.value
? 'builder:arrange'
@@ -112,7 +120,7 @@ export const useAppModeStore = defineStore('appMode', () => {
)
}
async function exitBuilder() {
function exitBuilder() {
resetSelectedToWorkflow()
setMode('graph')
}
@@ -122,6 +130,7 @@ export const useAppModeStore = defineStore('appMode', () => {
exitBuilder,
hasNodes,
hasOutputs,
pruneLinearData,
resetSelectedToWorkflow,
selectedInputs,
selectedOutputs

View File

@@ -549,6 +549,13 @@ export const useExecutionStore = defineStore('execution', () => {
() => runningJobIds.value.length
)
const isActiveWorkflowRunning = computed(() => {
if (!activeJobId.value) return false
const path = workflowStore.activeWorkflow?.path
if (!path) return false
return jobIdToSessionWorkflowPath.value.get(activeJobId.value) === path
})
return {
isIdle,
clientId,
@@ -568,6 +575,7 @@ export const useExecutionStore = defineStore('execution', () => {
runningJobIds,
runningWorkflowCount,
initializingJobIds,
isActiveWorkflowRunning,
isJobInitializing,
clearInitializationByJobId,
clearInitializationByJobIds,