mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-19 22:09:37 +00:00
## Summary Add missing delete and bookmark actions for user blueprints in the V2 node library sidebar, fixing parity with the V1 sidebar. ## Changes - **What**: - Add delete button (inline + context menu) for user blueprints in `TreeExplorerV2Node` and `TreeExplorerV2` - Extract `isUserBlueprint()` helper in `subgraphStore` for DRY usage across V1/V2 sidebars  ## Review Focus - `isUserBlueprint` consolidates logic previously duplicated between `NodeTreeLeaf` and the new V2 components - Context menu guard `contextMenuNode?.data` prevents showing empty menus - Folder `@contextmenu` handler clears stale `contextMenuNode` to prevent wrong actions ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-10827-fix-add-delete-bookmark-actions-for-blueprints-in-V2-node-library-sidebar-3366d73d36508111afd2c2c7d8ff0220) by [Unito](https://www.unito.io)
73 lines
2.2 KiB
Vue
73 lines
2.2 KiB
Vue
<template>
|
|
<div class="h-full flex-1 overflow-y-auto">
|
|
<!-- Favorites section -->
|
|
<h3
|
|
class="mb-0 px-4 py-2 text-xs font-medium tracking-wide text-muted-foreground uppercase"
|
|
>
|
|
{{ $t('sideToolbar.nodeLibraryTab.sections.bookmarked') }}
|
|
</h3>
|
|
<TreeExplorerV2
|
|
v-if="hasFavorites"
|
|
v-model:expanded-keys="expandedKeys"
|
|
:root="favoritesRoot"
|
|
show-context-menu
|
|
@node-click="(node) => emit('nodeClick', node)"
|
|
/>
|
|
<div v-else class="px-6 py-2 text-xs text-muted-background">
|
|
{{ $t('sideToolbar.nodeLibraryTab.noBookmarkedNodes') }}
|
|
</div>
|
|
|
|
<!-- Node sections -->
|
|
<div v-for="(section, index) in sections" :key="section.category ?? index">
|
|
<h3
|
|
v-if="section.category && sortOrder !== 'alphabetical'"
|
|
class="mb-0 px-4 py-2 text-xs font-medium tracking-wide text-muted-foreground uppercase"
|
|
>
|
|
{{ $t(NODE_CATEGORY_LABELS[section.category]) }}
|
|
</h3>
|
|
<TreeExplorerV2
|
|
v-model:expanded-keys="expandedKeys"
|
|
:root="section.root"
|
|
show-context-menu
|
|
@node-click="(node) => emit('nodeClick', node)"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { computed } from 'vue'
|
|
|
|
import TreeExplorerV2 from '@/components/common/TreeExplorerV2.vue'
|
|
import { useNodeBookmarkStore } from '@/stores/nodeBookmarkStore'
|
|
import type { ComfyNodeDefImpl } from '@/stores/nodeDefStore'
|
|
import { NODE_CATEGORY_LABELS } from '@/types/nodeOrganizationTypes'
|
|
import type {
|
|
NodeLibrarySection,
|
|
RenderedTreeExplorerNode,
|
|
TreeNode
|
|
} from '@/types/treeExplorerTypes'
|
|
|
|
const { fillNodeInfo, sortOrder = 'original' } = defineProps<{
|
|
sections: NodeLibrarySection<ComfyNodeDefImpl>[]
|
|
fillNodeInfo: (node: TreeNode) => RenderedTreeExplorerNode<ComfyNodeDefImpl>
|
|
sortOrder?: string
|
|
}>()
|
|
|
|
const expandedKeys = defineModel<string[]>('expandedKeys', { required: true })
|
|
|
|
const emit = defineEmits<{
|
|
nodeClick: [node: RenderedTreeExplorerNode<ComfyNodeDefImpl>]
|
|
}>()
|
|
|
|
const nodeBookmarkStore = useNodeBookmarkStore()
|
|
|
|
const hasFavorites = computed(
|
|
() => (nodeBookmarkStore.bookmarkedRoot.children?.length ?? 0) > 0
|
|
)
|
|
|
|
const favoritesRoot = computed(() =>
|
|
fillNodeInfo(nodeBookmarkStore.bookmarkedRoot)
|
|
)
|
|
</script>
|