From eb805d2ba736b721b644d18b5b84db4de77804f1 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Wed, 15 Oct 2025 12:17:32 +0300 Subject: [PATCH] refactor(editor): Extract `communityNodes` code into features (no-changelog) (#20747) --- .../editor-ui/src/components/Modals.vue | 10 +- .../ItemTypes/CommunityNodeItem.vue | 2 +- .../Node/NodeCreator/ItemTypes/NodeItem.vue | 2 +- .../Node/NodeCreator/Modes/ActionsMode.vue | 4 +- .../Panel/CommunityNodeDetails.vue | 2 +- .../Node/NodeCreator/Panel/NodesListPanel.vue | 8 +- .../Renderers/CategorizedItemsRenderer.vue | 2 +- .../editor-ui/src/components/NodeSettings.vue | 6 +- .../NodeSettingsInvalidNodeWarning.test.ts | 4 +- .../NodeSettingsInvalidNodeWarning.vue | 7 +- .../src/components/NodeSettingsTabs.test.ts | 6 +- .../src/components/NodeSettingsTabs.vue | 4 +- packages/frontend/editor-ui/src/constants.ts | 13 -- .../communityNodes.constants.ts | 16 ++ .../communityNodes}/communityNodes.store.ts | 2 +- .../communityNodes/communityNodes.types.ts | 5 + .../communityNodes.utils.test.ts} | 6 +- .../communityNodes/communityNodes.utils.ts} | 2 +- .../components/CommunityPackageCard.test.ts | 0 .../components/CommunityPackageCard.vue | 3 +- .../CommunityPackageInstallModal.test.ts | 6 +- .../CommunityPackageInstallModal.vue | 6 +- ...CommunityPackageManageConfirmModal.test.ts | 2 +- .../CommunityPackageManageConfirmModal.vue | 9 +- .../ContactAdministratorToInstall.vue | 0 .../components/NodesInWorkflowTable.test.ts | 2 +- .../components/NodesInWorkflowTable.vue | 0 .../nodeCreator}/CommunityNodeDetails.test.ts | 4 +- .../nodeCreator/CommunityNodeDetails.vue | 169 ++++++++++++++++++ .../nodeCreator}/CommunityNodeDocsLink.vue | 0 .../nodeCreator}/CommunityNodeFooter.test.ts | 4 +- .../nodeCreator}/CommunityNodeFooter.vue | 2 +- .../nodeCreator}/CommunityNodeInfo.test.ts | 22 ++- .../nodeCreator}/CommunityNodeInfo.vue | 8 +- .../nodeCreator}/CommunityNodeInstallHint.vue | 0 .../nodeCreator}/CommunityNodeUpdateInfo.vue | 0 .../composables/useInstallNode.test.ts | 8 +- .../composables/useInstallNode.ts | 6 +- .../useInstalledCommunityPackage.test.ts | 8 +- .../useInstalledCommunityPackage.ts | 4 +- .../views/SettingsCommunityNodesView.vue | 6 +- packages/frontend/editor-ui/src/router.ts | 2 +- .../frontend/editor-ui/src/stores/ui.store.ts | 8 +- 43 files changed, 286 insertions(+), 94 deletions(-) create mode 100644 packages/frontend/editor-ui/src/features/communityNodes/communityNodes.constants.ts rename packages/frontend/editor-ui/src/{stores => features/communityNodes}/communityNodes.store.ts (98%) create mode 100644 packages/frontend/editor-ui/src/features/communityNodes/communityNodes.types.ts rename packages/frontend/editor-ui/src/{utils/communityNodeUtils.test.ts => features/communityNodes/communityNodes.utils.test.ts} (93%) rename packages/frontend/editor-ui/src/{utils/communityNodeUtils.ts => features/communityNodes/communityNodes.utils.ts} (92%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/CommunityPackageCard.test.ts (100%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/CommunityPackageCard.vue (97%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/CommunityPackageInstallModal.test.ts (97%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/CommunityPackageInstallModal.vue (98%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/CommunityPackageManageConfirmModal.test.ts (98%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/CommunityPackageManageConfirmModal.vue (97%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/ContactAdministratorToInstall.vue (100%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/NodesInWorkflowTable.test.ts (96%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/components/NodesInWorkflowTable.vue (100%) rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeDetails.test.ts (97%) create mode 100644 packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeDetails.vue rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeDocsLink.vue (100%) rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeFooter.test.ts (96%) rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeFooter.vue (96%) rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeInfo.test.ts (91%) rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeInfo.vue (94%) rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeInstallHint.vue (100%) rename packages/frontend/editor-ui/src/{components/Node/NodeCreator/Panel => features/communityNodes/components/nodeCreator}/CommunityNodeUpdateInfo.vue (100%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/composables/useInstallNode.test.ts (98%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/composables/useInstallNode.ts (93%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/composables/useInstalledCommunityPackage.test.ts (97%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/composables/useInstalledCommunityPackage.ts (94%) rename packages/frontend/editor-ui/src/{ => features/communityNodes}/views/SettingsCommunityNodesView.vue (97%) diff --git a/packages/frontend/editor-ui/src/components/Modals.vue b/packages/frontend/editor-ui/src/components/Modals.vue index 49e7285e25a..13d34739ae5 100644 --- a/packages/frontend/editor-ui/src/components/Modals.vue +++ b/packages/frontend/editor-ui/src/components/Modals.vue @@ -4,8 +4,6 @@ import { ANNOTATION_TAGS_MANAGER_MODAL_KEY, CHANGE_PASSWORD_MODAL_KEY, CHAT_EMBED_MODAL_KEY, - COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, - COMMUNITY_PACKAGE_INSTALL_MODAL_KEY, CONTACT_PROMPT_MODAL_KEY, CREDENTIAL_EDIT_MODAL_KEY, CREDENTIAL_SELECT_MODAL_KEY, @@ -52,6 +50,10 @@ import { SOURCE_CONTROL_PULL_MODAL_KEY, SOURCE_CONTROL_PUSH_MODAL_KEY, } from '@/features/sourceControl.ee/sourceControl.constants'; +import { + COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, + COMMUNITY_PACKAGE_INSTALL_MODAL_KEY, +} from '@/features/communityNodes/communityNodes.constants'; import { API_KEY_CREATE_OR_EDIT_MODAL_KEY } from '@/features/apiKeys/apiKeys.constants'; import AboutModal from '@/components/AboutModal.vue'; import ActivationModal from '@/components/ActivationModal.vue'; @@ -60,8 +62,8 @@ import NewAssistantSessionModal from '@/features/assistant/components/Chat/NewAs import ChangePasswordModal from '@/features/auth/components/ChangePasswordModal.vue'; import ConfirmPasswordModal from '@/features/auth/components/ConfirmPasswordModal.vue'; import ChatEmbedModal from '@/components/ChatEmbedModal.vue'; -import CommunityPackageInstallModal from '@/components/CommunityPackageInstallModal.vue'; -import CommunityPackageManageConfirmModal from '@/components/CommunityPackageManageConfirmModal.vue'; +import CommunityPackageInstallModal from '@/features/communityNodes/components/CommunityPackageInstallModal.vue'; +import CommunityPackageManageConfirmModal from '@/features/communityNodes/components/CommunityPackageManageConfirmModal.vue'; import CommunityPlusEnrollmentModal from '@/features/communityPlus/components/CommunityPlusEnrollmentModal.vue'; import ContactPromptModal from '@/components/ContactPromptModal.vue'; import CredentialEdit from '@/components/CredentialEdit/CredentialEdit.vue'; diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CommunityNodeItem.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CommunityNodeItem.vue index e7fa5fe2cbd..ea92f4f6969 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CommunityNodeItem.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CommunityNodeItem.vue @@ -1,6 +1,6 @@ + + + + diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDocsLink.vue b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeDocsLink.vue similarity index 100% rename from packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDocsLink.vue rename to packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeDocsLink.vue diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.test.ts b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeFooter.test.ts similarity index 96% rename from packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.test.ts rename to packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeFooter.test.ts index ed82ecd7c9a..be5ef8952ae 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.test.ts +++ b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeFooter.test.ts @@ -6,12 +6,12 @@ import CommunityNodeFooter from './CommunityNodeFooter.vue'; import { createComponentRenderer } from '@/__tests__/render'; import { vi } from 'vitest'; import { ref } from 'vue'; -import type { ExtendedPublicInstalledPackage } from '@/utils/communityNodeUtils'; +import type { ExtendedPublicInstalledPackage } from '../../communityNodes.utils'; // Mock the useInstalledCommunityPackage composable const mockInstalledPackage = ref(undefined); -vi.mock('@/composables/useInstalledCommunityPackage', () => ({ +vi.mock('../../composables/useInstalledCommunityPackage', () => ({ useInstalledCommunityPackage: vi.fn(() => ({ installedPackage: mockInstalledPackage, isUpdateCheckAvailable: ref(false), diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.vue b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeFooter.vue similarity index 96% rename from packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.vue rename to packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeFooter.vue index ae97f30a1b1..5cde2641f6b 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.vue +++ b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeFooter.vue @@ -4,7 +4,7 @@ import { captureException } from '@sentry/vue'; import { onMounted, ref } from 'vue'; import { useRouter } from 'vue-router'; -import { useInstalledCommunityPackage } from '@/composables/useInstalledCommunityPackage'; +import { useInstalledCommunityPackage } from '../../composables/useInstalledCommunityPackage'; import { i18n } from '@n8n/i18n'; import { N8nLink, N8nText } from '@n8n/design-system'; diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.test.ts b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeInfo.test.ts similarity index 91% rename from packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.test.ts rename to packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeInfo.test.ts index 92f954028ce..df28334fb24 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.test.ts +++ b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeInfo.test.ts @@ -1,11 +1,11 @@ import { createComponentRenderer } from '@/__tests__/render'; -import { useInstalledCommunityPackage } from '@/composables/useInstalledCommunityPackage'; -import type { ExtendedPublicInstalledPackage } from '@/utils/communityNodeUtils'; +import { useInstalledCommunityPackage } from '../../composables/useInstalledCommunityPackage'; +import type { ExtendedPublicInstalledPackage } from '../../communityNodes.utils'; import { type TestingPinia, createTestingPinia } from '@pinia/testing'; import { waitFor } from '@testing-library/vue'; import { setActivePinia } from 'pinia'; import { type ComputedRef, ref } from 'vue'; -import type { CommunityNodeDetails } from '../composables/useViewStacks'; +import type { CommunityNodeDetails } from '@/components/Node/NodeCreator/composables/useViewStacks'; import CommunityNodeInfo from './CommunityNodeInfo.vue'; vi.mock('./utils', () => ({ @@ -26,7 +26,7 @@ const defaultUseInstalledCommunityPackage = { initInstalledPackage: vi.fn(), } as unknown as ReturnType; -vi.mock('@/composables/useInstalledCommunityPackage', () => ({ +vi.mock('../../composables/useInstalledCommunityPackage', () => ({ useInstalledCommunityPackage: vi.fn(() => defaultUseInstalledCommunityPackage), })); @@ -44,7 +44,7 @@ vi.mock('@/features/users/users.store', () => ({ })), })); -vi.mock('../composables/useViewStacks', () => ({ +vi.mock('@/components/Node/NodeCreator/composables/useViewStacks', () => ({ useViewStacks: vi.fn(), })); @@ -94,7 +94,9 @@ describe('CommunityNodeInfo', () => { originalFetch = global.fetch; global.fetch = vi.fn(); - const { useViewStacks } = await import('../composables/useViewStacks'); + const { useViewStacks } = await import( + '@/components/Node/NodeCreator/composables/useViewStacks' + ); vi.mocked(useViewStacks).mockReturnValue({ activeViewStack: defaultViewStack, } as ReturnType); @@ -135,7 +137,9 @@ describe('CommunityNodeInfo', () => { }); it('should display update notice, should show verified badge for older versions', async () => { - const { useViewStacks } = await import('../composables/useViewStacks'); + const { useViewStacks } = await import( + '@/components/Node/NodeCreator/composables/useViewStacks' + ); vi.mocked(useViewStacks).mockReturnValue({ activeViewStack: { ...defaultViewStack, @@ -179,7 +183,9 @@ describe('CommunityNodeInfo', () => { }); it('should NOT display update notice for unverified update', async () => { - const { useViewStacks } = await import('../composables/useViewStacks'); + const { useViewStacks } = await import( + '@/components/Node/NodeCreator/composables/useViewStacks' + ); vi.mocked(useViewStacks).mockReturnValue({ activeViewStack: { ...defaultViewStack, diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.vue b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeInfo.vue similarity index 94% rename from packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.vue rename to packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeInfo.vue index 6fa31b12671..3318ced8246 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.vue +++ b/packages/frontend/editor-ui/src/features/communityNodes/components/nodeCreator/CommunityNodeInfo.vue @@ -1,16 +1,16 @@