diff --git a/browser_tests/ComfyPage.ts b/browser_tests/ComfyPage.ts index 8bc2cca07..7c4d13644 100644 --- a/browser_tests/ComfyPage.ts +++ b/browser_tests/ComfyPage.ts @@ -575,6 +575,10 @@ export class ComfyPage { await this.nextFrame() } + async getVisibleToastCount() { + return await this.page.locator('.p-toast:visible').count() + } + async clickTextEncodeNode1() { await this.canvas.click({ position: { diff --git a/browser_tests/groupNode.spec.ts b/browser_tests/groupNode.spec.ts index e24255ce0..c72245473 100644 --- a/browser_tests/groupNode.spec.ts +++ b/browser_tests/groupNode.spec.ts @@ -252,4 +252,20 @@ test.describe('Group Node', () => { }) }) }) + + test.describe('Keybindings', () => { + test('Convert to group node, no selection', async ({ comfyPage }) => { + expect(await comfyPage.getVisibleToastCount()).toBe(0) + await comfyPage.page.keyboard.press('Alt+g') + await comfyPage.page.waitForTimeout(300) + expect(await comfyPage.getVisibleToastCount()).toBe(1) + }) + test('Convert to group node, selected 1 node', async ({ comfyPage }) => { + expect(await comfyPage.getVisibleToastCount()).toBe(0) + await comfyPage.clickTextEncodeNode1() + await comfyPage.page.keyboard.press('Alt+g') + await comfyPage.page.waitForTimeout(300) + expect(await comfyPage.getVisibleToastCount()).toBe(1) + }) + }) }) diff --git a/src/extensions/core/groupNode.ts b/src/extensions/core/groupNode.ts index b8518b2fa..492a21653 100644 --- a/src/extensions/core/groupNode.ts +++ b/src/extensions/core/groupNode.ts @@ -1450,22 +1450,27 @@ const replaceLegacySeparators = (nodes: ComfyNode[]): void => { } } -function convertSelectedNodesToGroupNode() { - if ( - !app.canvas.selected_nodes || - Object.keys(app.canvas.selected_nodes).length === 0 - ) { - useToastStore().add({ - severity: 'error', - summary: 'No nodes selected', - detail: 'Please select nodes to convert to group node', - life: 3000 - }) - return +/** + * Convert selected nodes to a group node + * @throws {Error} if no nodes are selected + * @throws {Error} if a group node is already selected + * @throws {Error} if a group node is selected + * + * The context menu item should not be available if any of the above conditions are met. + * The error is automatically handled by the commandStore when the command is executed. + */ +async function convertSelectedNodesToGroupNode() { + const nodes = Object.values(app.canvas.selected_nodes ?? {}) + if (nodes.length === 0) { + throw new Error('No nodes selected') } - - const nodes = Object.values(app.canvas.selected_nodes) - return GroupNodeHandler.fromNodes(nodes) + if (nodes.length === 1) { + throw new Error('Please select multiple nodes to convert to group node') + } + if (nodes.some((n) => GroupNodeHandler.isGroupNode(n))) { + throw new Error('Selected nodes contain a group node') + } + return await GroupNodeHandler.fromNodes(nodes) } function ungroupSelectedGroupNodes() {