From 7a01be388f14c20e9cd3e500a37d379c013ced4e Mon Sep 17 00:00:00 2001 From: AustinMroz Date: Fri, 6 Mar 2026 13:41:52 -0800 Subject: [PATCH] More app fixes (#9432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Increased the z-index on app mode outputs so that they display above a zoomed image - The "view job" button on the job queued toast in mobile app mode will take you to outputs instead of assets - Image previews now have a minimum zoom of ~20% and a maximum zoom of ~50x - The enter panel in linear mode now has a minimum size of ~1/5th screen size - In arrange mode, dragging to rearrange inputs will no longer cause a horizontal scrollbar to appear. - Videos will now display the first frame instead of a generic video icon - Muted/Bypassed nodes can no longer be selected as inputs/outputs, or be displayed when in app mode. - Linked input can no longer be selected or displayed - Adds a share workflow button in app mode and wires up the existing context menu ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9432-More-app-fixes-31a6d73d365081509cd0ea74bfdc9b95) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action --- src/components/appMode/AppModeToolbar.vue | 24 +++++++++++++++++++ src/components/builder/AppBuilder.vue | 14 ++++++++--- src/components/ui/ZoomPane.vue | 3 ++- .../useWorkflowActionsMenu.test.ts | 2 ++ src/composables/useWorkflowActionsMenu.ts | 8 +++++-- .../extensions/linearMode/AppInput.vue | 4 ++-- .../extensions/linearMode/LinearControls.vue | 8 ++++--- .../extensions/linearMode/LinearPreview.vue | 2 +- .../extensions/linearMode/MobileDisplay.vue | 2 +- .../extensions/linearMode/OutputHistory.vue | 2 +- .../linearMode/OutputHistoryItem.vue | 12 ++++++++++ .../vueNodes/components/LGraphNode.vue | 4 +++- .../vueNodes/components/NodeWidgets.vue | 10 +++++++- src/views/LinearView.vue | 2 +- 14 files changed, 80 insertions(+), 17 deletions(-) diff --git a/src/components/appMode/AppModeToolbar.vue b/src/components/appMode/AppModeToolbar.vue index 8f012e15d1..3d66fafc0e 100644 --- a/src/components/appMode/AppModeToolbar.vue +++ b/src/components/appMode/AppModeToolbar.vue @@ -3,9 +3,16 @@ import { computed } from 'vue' import { useI18n } from 'vue-i18n' import WorkflowActionsDropdown from '@/components/common/WorkflowActionsDropdown.vue' +import { useErrorHandling } from '@/composables/useErrorHandling' +import { useFeatureFlags } from '@/composables/useFeatureFlags' import Button from '@/components/ui/button/Button.vue' import { useAppMode } from '@/composables/useAppMode' import { useWorkflowTemplateSelectorDialog } from '@/composables/useWorkflowTemplateSelectorDialog' +import { isCloud } from '@/platform/distribution/types' +import { + openShareDialog, + prefetchShareDialog +} from '@/platform/workflow/sharing/composables/lazyShareDialog' import { useAppModeStore } from '@/stores/appModeStore' import { useCommandStore } from '@/stores/commandStore' import { useWorkspaceStore } from '@/stores/workspaceStore' @@ -18,6 +25,8 @@ const workspaceStore = useWorkspaceStore() const { enableAppBuilder } = useAppMode() const appModeStore = useAppModeStore() const { enterBuilder } = appModeStore +const { toastErrorHandler } = useErrorHandling() +const { flags } = useFeatureFlags() const { hasNodes } = storeToRefs(appModeStore) const tooltipOptions = { showDelay: 300, hideDelay: 300 } @@ -60,6 +69,21 @@ function openTemplates() { > +
{ void appModeStore.selectedOutputs.length return canvas - .graph!.nodes.filter((n) => n.constructor.nodeData?.output_node) + .graph!.nodes.filter( + (n) => + n.constructor.nodeData?.output_node && n.mode === LGraphEventMode.ALWAYS + ) .map(nodeToDisplayTuple) }) const renderedInputs = computed<[string, MaybeRef | undefined][]>( @@ -215,6 +222,7 @@ const renderedInputs = computed<[string, MaybeRef | undefined][]>( v-if="isArrangeMode" v-slot="{ dragClass }" v-model="appModeStore.selectedInputs" + class="overflow-x-clip" >
1200 : zoom.value < -500)) + return zoom.value -= e.deltaY const { x, y, width, height } = zoomPaneEl.getBoundingClientRect() diff --git a/src/composables/useWorkflowActionsMenu.test.ts b/src/composables/useWorkflowActionsMenu.test.ts index 36a2c7ec2f..73a355c809 100644 --- a/src/composables/useWorkflowActionsMenu.test.ts +++ b/src/composables/useWorkflowActionsMenu.test.ts @@ -81,6 +81,8 @@ vi.mock('@/stores/appModeStore', () => ({ useAppModeStore: vi.fn(() => mockAppModeStore) })) +vi.mock('@/composables/useErrorHandling', () => ({})) + vi.mock('@/composables/useFeatureFlags', () => ({ useFeatureFlags: vi.fn(() => mockFeatureFlags) })) diff --git a/src/composables/useWorkflowActionsMenu.ts b/src/composables/useWorkflowActionsMenu.ts index b4e186eacc..9bce704606 100644 --- a/src/composables/useWorkflowActionsMenu.ts +++ b/src/composables/useWorkflowActionsMenu.ts @@ -2,7 +2,10 @@ import type { ComputedRef, Ref } from 'vue' import { computed } from 'vue' import { useI18n } from 'vue-i18n' +import { useErrorHandling } from '@/composables/useErrorHandling' import { useFeatureFlags } from '@/composables/useFeatureFlags' +import { isCloud } from '@/platform/distribution/types' +import { openShareDialog } from '@/platform/workflow/sharing/composables/lazyShareDialog' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import type { ComfyWorkflow } from '@/platform/workflow/management/stores/workflowStore' import { @@ -191,8 +194,9 @@ export function useWorkflowActionsMenu( id: 'share', label: t('breadcrumbsMenu.share'), icon: 'icon-[comfy--send]', - command: async () => {}, - visible: false + command: () => + openShareDialog().catch(useErrorHandling().toastErrorHandler), + visible: isCloud && flags.workflowSharingEnabled }) addItem({ diff --git a/src/renderer/extensions/linearMode/AppInput.vue b/src/renderer/extensions/linearMode/AppInput.vue index 9e855f61fd..7b56dbb6f8 100644 --- a/src/renderer/extensions/linearMode/AppInput.vue +++ b/src/renderer/extensions/linearMode/AppInput.vue @@ -8,7 +8,7 @@ import { cn } from '@/utils/tailwindUtil' const { id, name } = defineProps<{ id: string - isSelectInputsMode: boolean + enable: boolean name: string }>() @@ -25,7 +25,7 @@ function togglePromotion() {