From dcd6038c3085135803cdaa546a239359a6d449eb Mon Sep 17 00:00:00 2001 From: Ivan Atanasov Date: Tue, 29 Oct 2024 15:25:35 +0100 Subject: [PATCH] fix(editor): Change tooltip for workflow with execute workflow trigger (#11374) --- .../src/components/WorkflowActivator.test.ts | 82 +++++++++++++++++++ .../src/components/WorkflowActivator.vue | 21 ++++- .../src/plugins/i18n/locales/en.json | 1 + 3 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 packages/editor-ui/src/components/WorkflowActivator.test.ts diff --git a/packages/editor-ui/src/components/WorkflowActivator.test.ts b/packages/editor-ui/src/components/WorkflowActivator.test.ts new file mode 100644 index 0000000000000..62f9481636ced --- /dev/null +++ b/packages/editor-ui/src/components/WorkflowActivator.test.ts @@ -0,0 +1,82 @@ +import { describe, it, expect, vi } from 'vitest'; +import WorkflowActivator from '@/components/WorkflowActivator.vue'; +import userEvent from '@testing-library/user-event'; + +import { useWorkflowsStore } from '@/stores/workflows.store'; + +import { createTestingPinia } from '@pinia/testing'; +import { createComponentRenderer } from '@/__tests__/render'; +import { mockedStore } from '@/__tests__/utils'; +import { EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE } from '@/constants'; + +const renderComponent = createComponentRenderer(WorkflowActivator); +let mockWorkflowsStore: ReturnType>; + +describe('WorkflowActivator', () => { + beforeEach(() => { + createTestingPinia(); + + mockWorkflowsStore = mockedStore(useWorkflowsStore); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('renders correctly', () => { + const renderOptions = { + props: { + workflowActive: false, + workflowId: '1', + workflowPermissions: { update: true }, + }, + }; + + const { getByTestId, getByRole } = renderComponent(renderOptions); + expect(getByTestId('workflow-activator-status')).toBeInTheDocument(); + expect(getByRole('switch')).toBeInTheDocument(); + }); + + it('display an inactive tooltip when there are no nodes available', async () => { + mockWorkflowsStore.workflowId = '1'; + + const { getByTestId, getByRole } = renderComponent({ + props: { + workflowActive: false, + workflowId: '1', + workflowPermissions: { update: true }, + }, + }); + + await userEvent.hover(getByRole('switch')); + expect(getByRole('tooltip')).toBeInTheDocument(); + + expect(getByRole('tooltip')).toHaveTextContent( + 'This workflow has no trigger nodes that require activation', + ); + expect(getByTestId('workflow-activator-status')).toHaveTextContent('Inactive'); + }); + + it('display an inactive tooltip when only execute workflow trigger is available', async () => { + mockWorkflowsStore.workflowId = '1'; + mockWorkflowsStore.workflowTriggerNodes = [ + { type: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE, disabled: false } as never, + ]; + + const { getByTestId, getByRole } = renderComponent({ + props: { + workflowActive: false, + workflowId: '1', + workflowPermissions: { update: true }, + }, + }); + + await userEvent.hover(getByRole('switch')); + expect(getByRole('tooltip')).toBeInTheDocument(); + + expect(getByRole('tooltip')).toHaveTextContent( + "Execute Workflow Trigger' doesn't require activation as it is triggered by another workflow", + ); + expect(getByTestId('workflow-activator-status')).toHaveTextContent('Inactive'); + }); +}); diff --git a/packages/editor-ui/src/components/WorkflowActivator.vue b/packages/editor-ui/src/components/WorkflowActivator.vue index 6bfe6f799eed1..8dec6f66202a4 100644 --- a/packages/editor-ui/src/components/WorkflowActivator.vue +++ b/packages/editor-ui/src/components/WorkflowActivator.vue @@ -7,7 +7,7 @@ import type { VNode } from 'vue'; import { computed, h } from 'vue'; import { useI18n } from '@/composables/useI18n'; import type { PermissionsRecord } from '@/permissions'; -import { PLACEHOLDER_EMPTY_WORKFLOW_ID } from '@/constants'; +import { EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE, PLACEHOLDER_EMPTY_WORKFLOW_ID } from '@/constants'; import WorkflowActivationErrorMessage from './WorkflowActivationErrorMessage.vue'; const props = defineProps<{ @@ -43,6 +43,17 @@ const containsTrigger = computed((): boolean => { return foundTriggers.length > 0; }); +const containsOnlyExecuteWorkflowTrigger = computed((): boolean => { + const foundActiveTriggers = workflowsStore.workflowTriggerNodes.filter( + (trigger) => !trigger.disabled, + ); + const foundTriggers = foundActiveTriggers.filter( + (trigger) => trigger.type === EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE, + ); + + return foundTriggers.length > 0 && foundTriggers.length === foundActiveTriggers.length; +}); + const isNewWorkflow = computed( () => !props.workflowId || @@ -109,7 +120,13 @@ async function displayActivationError() { Click to display error message.", "workflowActivator.thisWorkflowHasNoTriggerNodes": "This workflow has no trigger nodes that require activation", + "workflowActivator.thisWorkflowHasOnlyOneExecuteWorkflowTriggerNode": "'Execute Workflow Trigger' doesn't require activation as it is triggered by another workflow", "workflowDetails.share": "Share", "workflowDetails.active": "Active", "workflowDetails.addTag": "Add tag",