diff --git a/src/components/appMode/AppModeToolbar.vue b/src/components/appMode/AppModeToolbar.vue index 9ee809ba90..07ef4595f2 100644 --- a/src/components/appMode/AppModeToolbar.vue +++ b/src/components/appMode/AppModeToolbar.vue @@ -9,11 +9,13 @@ import { useCommandStore } from '@/stores/commandStore' import { useWorkspaceStore } from '@/stores/workspaceStore' import { cn } from '@/utils/tailwindUtil' import { useAppMode } from '@/composables/useAppMode' +import { useAppModeStore } from '@/stores/appModeStore' const { t } = useI18n() const commandStore = useCommandStore() const workspaceStore = useWorkspaceStore() -const { enableAppBuilder, setMode } = useAppMode() +const { enableAppBuilder } = useAppMode() +const { enterBuilder } = useAppModeStore() const tooltipOptions = { showDelay: 300, hideDelay: 300 } const isAssetsActive = computed( @@ -23,10 +25,6 @@ const isWorkflowsActive = computed( () => workspaceStore.sidebarTab.activeSidebarTab?.id === 'workflows' ) -function enterBuilderMode() { - setMode('builder:select') -} - function openAssets() { void commandStore.execute('Workspace.ToggleSidebarTab.assets') } @@ -75,7 +73,7 @@ function openTemplates() { size="unset" :aria-label="t('linearMode.appModeToolbar.appBuilder')" class="size-10 rounded-lg" - @click="enterBuilderMode" + @click="enterBuilder" > diff --git a/src/renderer/extensions/linearMode/LinearWelcome.vue b/src/renderer/extensions/linearMode/LinearWelcome.vue index 880c7cbcf7..5ba625a5c1 100644 --- a/src/renderer/extensions/linearMode/LinearWelcome.vue +++ b/src/renderer/extensions/linearMode/LinearWelcome.vue @@ -7,7 +7,8 @@ import { storeToRefs } from 'pinia' const { t } = useI18n() const { setMode } = useAppMode() -const { hasOutputs } = storeToRefs(useAppModeStore()) +const appModeStore = useAppModeStore() +const { hasOutputs } = storeToRefs(appModeStore) @@ -44,7 +45,7 @@ const { hasOutputs } = storeToRefs(useAppModeStore()) {{ t('linearMode.welcome.backToWorkflow') }} - + {{ t('linearMode.welcome.buildApp') }} ('graph') +const mockSetMode = vi.fn() + +vi.mock('@/composables/useAppMode', () => ({ + useAppMode: () => ({ + mode: computed(() => modeRef.value), + setMode: mockSetMode, + isBuilderMode: computed( + () => + modeRef.value === 'builder:select' || + modeRef.value === 'builder:arrange' + ), + isAppMode: computed( + () => modeRef.value === 'app' || modeRef.value === 'builder:arrange' + ), + isSelectMode: computed(() => modeRef.value === 'builder:select'), + isArrangeMode: computed(() => modeRef.value === 'builder:arrange'), + isGraphMode: computed( + () => modeRef.value === 'graph' || modeRef.value === 'builder:select' + ) + }) +})) + +vi.mock('@/renderer/core/canvas/canvasStore', () => ({ + useCanvasStore: () => ({ + getCanvas: () => ({ read_only: false }) + }) +})) + +vi.mock('@/platform/workflow/management/stores/workflowStore', () => ({ + useWorkflowStore: () => ({ + activeWorkflow: null + }) +})) + +describe('appModeStore', () => { + beforeEach(() => { + setActivePinia(createPinia()) + modeRef.value = 'graph' + mockSetMode.mockClear() + }) + + describe('enterBuilder', () => { + it('navigates to builder:arrange when in app mode with outputs', () => { + modeRef.value = 'app' + const store = useAppModeStore() + store.selectedOutputs.push('1') + + store.enterBuilder() + + expect(mockSetMode).toHaveBeenCalledWith('builder:arrange') + }) + + it('navigates to builder:select when in app mode without outputs', () => { + modeRef.value = 'app' + const store = useAppModeStore() + + store.enterBuilder() + + expect(mockSetMode).toHaveBeenCalledWith('builder:select') + }) + + it('navigates to builder:select when in graph mode with outputs', () => { + modeRef.value = 'graph' + const store = useAppModeStore() + store.selectedOutputs.push('1') + + store.enterBuilder() + + expect(mockSetMode).toHaveBeenCalledWith('builder:select') + }) + + it('navigates to builder:select when in graph mode without outputs', () => { + modeRef.value = 'graph' + const store = useAppModeStore() + + store.enterBuilder() + + expect(mockSetMode).toHaveBeenCalledWith('builder:select') + }) + }) +}) diff --git a/src/stores/appModeStore.ts b/src/stores/appModeStore.ts index 7c637799ef..2726722511 100644 --- a/src/stores/appModeStore.ts +++ b/src/stores/appModeStore.ts @@ -66,6 +66,14 @@ export const useAppModeStore = defineStore('appMode', () => { (inSelect) => (getCanvas().read_only = inSelect) ) + function enterBuilder() { + setMode( + mode.value === 'app' && hasOutputs.value + ? 'builder:arrange' + : 'builder:select' + ) + } + async function exitBuilder() { const workflow = workflowStore.activeWorkflow if (workflow) workflow.dirtyLinearData = null @@ -74,6 +82,7 @@ export const useAppModeStore = defineStore('appMode', () => { } return { + enterBuilder, exitBuilder, hasOutputs, flushSelections,