Compare commits

..

1 Commits

Author SHA1 Message Date
bymyself
81c42ba864 update search type badges 2026-05-03 21:55:59 -07:00
5 changed files with 30 additions and 90 deletions

View File

@@ -6,8 +6,7 @@ import { TestIds } from '@e2e/fixtures/selectors'
import { fitToViewInstant } from '@e2e/fixtures/utils/fitToView'
import {
getPromotedWidgetNames,
getPromotedWidgetCount,
getPseudoPreviewWidgets
getPromotedWidgetCount
} from '@e2e/fixtures/utils/promotedWidgets'
async function expectPromotedWidgetNamesToContain(
@@ -94,34 +93,6 @@ test.describe(
'filename_prefix'
)
})
test('LoadImage node gets $$canvas-image-preview pseudo-widget promoted', async ({
comfyPage
}) => {
await comfyPage.workflow.loadWorkflow('default')
// Add a LoadImage node and convert to subgraph programmatically
const subgraphNodeId = await comfyPage.page.evaluate(() => {
const graph = window.app!.graph!
const node = window.LiteGraph!.createNode('LoadImage')!
node.pos = [300, 300]
graph.add(node)
const { node: subgraphNode } = graph.convertToSubgraph(
new Set([node])
)
return String(subgraphNode.id)
})
await comfyPage.nextFrame()
const pseudoWidgets = await getPseudoPreviewWidgets(
comfyPage,
subgraphNodeId
)
expect(pseudoWidgets.length).toBeGreaterThan(0)
expect(
pseudoWidgets.some(([, name]) => name === '$$canvas-image-preview')
).toBe(true)
})
})
test.describe('Promoted Widget Visibility in LiteGraph Mode', () => {

View File

@@ -1,13 +1,23 @@
<template>
<div class="flex flex-col gap-2">
<SelectButton
v-model="selectedFilter"
class="filter-type-select"
:options="filters"
:allow-empty="false"
option-label="name"
@change="updateSelectedFilterValue"
/>
<div class="flex flex-wrap gap-2">
<Button
v-for="filterOption in filters"
:key="filterOption.id"
type="button"
size="sm"
:variant="
selectedFilter?.id === filterOption.id
? 'secondary'
: 'muted-textonly'
"
class="flex-1 justify-center px-3 py-2 text-sm"
:aria-pressed="selectedFilter?.id === filterOption.id"
@click="selectFilterOption(filterOption)"
>
{{ filterOption.name }}
</Button>
</div>
<Select
v-model="selectedFilterValue"
class="filter-value-select"
@@ -23,7 +33,6 @@
<script setup lang="ts">
import Select from 'primevue/select'
import SelectButton from 'primevue/selectbutton'
import { computed, onMounted, ref } from 'vue'
import Button from '@/components/ui/button/Button.vue'
@@ -57,6 +66,16 @@ const updateSelectedFilterValue = () => {
selectedFilterValue.value = filterValues.value[0]
}
const selectFilterOption = (
filterOption: FuseFilter<ComfyNodeDefImpl, string>
) => {
if (selectedFilter.value?.id === filterOption.id) {
return
}
selectedFilter.value = filterOption
updateSelectedFilterValue()
}
const submit = () => {
if (!selectedFilter.value) {
return

View File

@@ -4,9 +4,7 @@ export const CANVAS_IMAGE_PREVIEW_WIDGET = '$$canvas-image-preview'
const CANVAS_IMAGE_PREVIEW_NODE_TYPES = new Set([
'PreviewImage',
'SaveImage',
'GLSLShader',
'LoadImage',
'LoadVideo'
'GLSLShader'
])
export function supportsVirtualCanvasImagePreview(node: LGraphNode): boolean {

View File

@@ -203,28 +203,6 @@ describe('getPromotableWidgets', () => {
).toBe(true)
})
it('adds virtual canvas preview widget for LoadImage nodes', () => {
const node = new LGraphNode('LoadImage')
node.type = 'LoadImage'
const widgets = getPromotableWidgets(node)
expect(
widgets.some((widget) => widget.name === CANVAS_IMAGE_PREVIEW_WIDGET)
).toBe(true)
})
it('adds virtual canvas preview widget for LoadVideo nodes', () => {
const node = new LGraphNode('LoadVideo')
node.type = 'LoadVideo'
const widgets = getPromotableWidgets(node)
expect(
widgets.some((widget) => widget.name === CANVAS_IMAGE_PREVIEW_WIDGET)
).toBe(true)
})
it('does not add virtual canvas preview widget for non-image nodes', () => {
const node = new LGraphNode('TextNode')
node.addOutput('TEXT', 'STRING')
@@ -293,25 +271,6 @@ describe('promoteRecommendedWidgets', () => {
expect(updatePreviewsMock).not.toHaveBeenCalled()
})
it('eagerly promotes virtual preview widget for LoadImage nodes', () => {
const subgraph = createTestSubgraph()
const subgraphNode = createTestSubgraphNode(subgraph)
const loadImageNode = new LGraphNode('LoadImage')
loadImageNode.type = 'LoadImage'
subgraph.add(loadImageNode)
promoteRecommendedWidgets(subgraphNode)
const store = usePromotionStore()
expect(
store.isPromoted(subgraphNode.rootGraph.id, subgraphNode.id, {
sourceNodeId: String(loadImageNode.id),
sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET
})
).toBe(true)
expect(updatePreviewsMock).not.toHaveBeenCalled()
})
it('registers $$canvas-image-preview on configure for GLSLShader in saved workflow', () => {
// Simulate loading a saved workflow where proxyWidgets does NOT contain
// the $$canvas-image-preview entry (e.g. blueprint authored before the

View File

@@ -110,13 +110,6 @@ export const useImageUploadWidget = () => {
isAnimated
})
node.graph?.setDirtyCanvas(true)
// When this node is inside a subgraph, also dirty the root canvas so
// the parent SubgraphNode redraws and picks up the new preview via
// its onDrawBackground → updatePreviews loop.
const rootGraph = node.graph?.rootGraph
if (rootGraph && rootGraph !== node.graph) {
rootGraph.setDirtyCanvas(true)
}
}
// On load if we have a value then render the image