From f6122397e47877eeb65781b13eb848c1cb45797c Mon Sep 17 00:00:00 2001 From: --list <18093452+simula-r@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:35:03 -0800 Subject: [PATCH 1/2] feat: vue nodes onboarding toggle in menu --- src/components/sidebar/ComfyMenuButton.vue | 64 ++++++++++++++++++- .../toast/VueNodesMigrationToast.vue | 6 +- src/components/topbar/TryVueNodeBanner.vue | 4 +- src/composables/useComfyMenu.ts | 22 +++++++ src/locales/en/main.json | 8 +-- 5 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 src/composables/useComfyMenu.ts diff --git a/src/components/sidebar/ComfyMenuButton.vue b/src/components/sidebar/ComfyMenuButton.vue index d2168ae0af..efedc95a72 100644 --- a/src/components/sidebar/ComfyMenuButton.vue +++ b/src/components/sidebar/ComfyMenuButton.vue @@ -1,5 +1,6 @@ @@ -73,13 +103,16 @@ import type { MenuItem } from 'primevue/menuitem' import TieredMenu from 'primevue/tieredmenu' import type { TieredMenuMethods, TieredMenuState } from 'primevue/tieredmenu' -import { computed, nextTick, ref } from 'vue' +import ToggleSwitch from 'primevue/toggleswitch' +import { computed, nextTick, onMounted, ref } from 'vue' import { useI18n } from 'vue-i18n' import SettingDialogHeader from '@/components/dialog/header/SettingDialogHeader.vue' import ComfyLogo from '@/components/icons/ComfyLogo.vue' +import { useComfyMenu } from '@/composables/useComfyMenu' import { useWorkflowTemplateSelectorDialog } from '@/composables/useWorkflowTemplateSelectorDialog' import SettingDialogContent from '@/platform/settings/components/SettingDialogContent.vue' +import { useSettingStore } from '@/platform/settings/settingStore' import { useTelemetry } from '@/platform/telemetry' import { useColorPaletteService } from '@/services/colorPaletteService' import { useCommandStore } from '@/stores/commandStore' @@ -98,10 +131,20 @@ const colorPaletteStore = useColorPaletteStore() const colorPaletteService = useColorPaletteService() const dialogStore = useDialogStore() const managerState = useManagerState() +const settingStore = useSettingStore() +const { registerMenuButton } = useComfyMenu() const menuRef = ref< ({ dirty: boolean } & TieredMenuMethods & TieredMenuState) | null >(null) +const menuButtonRef = ref(null) + +const nodes2Enabled = computed({ + get: () => settingStore.get('Comfy.VueNodes.Enabled') ?? false, + set: async (value: boolean) => { + await settingStore.set('Comfy.VueNodes.Enabled', value) + } +}) const telemetry = useTelemetry() @@ -112,6 +155,10 @@ function onLogoMenuClick(event: MouseEvent) { menuRef.value?.toggle(event) } +onMounted(() => { + registerMenuButton(menuButtonRef.value) +}) + const translateMenuItem = (item: MenuItem): MenuItem => { const label = typeof item.label === 'function' ? item.label() : item.label const translatedLabel = label @@ -164,6 +211,10 @@ const extraMenuItems = computed(() => [ label: t('menu.theme'), items: themeMenuItems.value }, + { + key: 'nodes-2.0-toggle', + label: 'Nodes 2.0' + }, { separator: true }, { key: 'browse-templates', @@ -281,6 +332,17 @@ const hasActiveStateSiblings = (item: MenuItem): boolean => { menuItemStore.menuItemHasActiveStateChildren[item.parentPath]) ) } + +const handleNodes2ToggleClick = () => { + return false +} + +const onNodes2ToggleChange = async (value: boolean) => { + await settingStore.set('Comfy.VueNodes.Enabled', value) + telemetry?.trackUiButtonClicked({ + button_id: `menu_nodes_2.0_toggle_${value ? 'enabled' : 'disabled'}` + }) +}