mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-02 13:17:48 +00:00
## Summary Simplify the Missing Node Packs error card so it follows the new error-tab item-row direction, with clearer pack rows, predictable locate behavior, and focused E2E coverage. This is the third PR in the staged error-tab simplification plan: 1. Merged: execution/prompt/validation error presentation and catalog grouping in #12683. 2. Merged: missing media presentation simplification in #12705. 3. This PR: missing node pack presentation simplification. 4. Planned next: swap-node presentation simplification. 5. Planned later: missing model presentation and action-flow simplification. ## Changes - **What**: Refactors Missing Node Packs rows so pack-level and node-level actions are easier to scan and more consistent with the rest of the refreshed Errors tab. - **What**: Removes the node-id badge from missing node pack rows, matching the simplified item-row direction. - **What**: Makes a single-node known pack row directly locatable from the pack label, rather than rendering an extra child row. - **What**: Keeps multi-node packs collapsed by default, with both the chevron and pack title toggling the child node list. - **What**: Keeps unknown packs expanded by default, including the single-node unknown-pack case, so users can still see the unresolved node type immediately. - **What**: Keeps per-node child rows clickable for locate-on-canvas behavior when a pack contains multiple affected nodes. - **What**: Replaces missing-node-pack action labels with shared `g.install` and `g.search` copy and removes now-unused English locale keys. - **What**: Adds targeted Playwright coverage for the simplified missing-node-pack card, including unknown-pack default rows, row-label locate behavior, and chevron/title expansion behavior. - **Breaking**: None. - **Dependencies**: None. ## Review Focus Please focus on the missing-node-pack row behavior: - Single known pack with one affected node should stay compact and locate the node from the pack label or locate icon. - Known packs with multiple affected nodes should show a count, start collapsed, and expand/collapse from either the chevron or title. - Unknown packs should expose the affected node rows immediately, including when there is only one affected node. - Locate actions should remain attached to the affected node rows, not to the parent pack when there are multiple nodes. - The E2E fixture intentionally uses two missing nodes with the same `cnr_id` and node sizes of `[400, 200]` to follow browser-test asset guidance. ## Validation - `pnpm format:check` - `pnpm lint` - `pnpm typecheck` - `pnpm knip --cache` via pre-push hook - `pnpm test:unit src/components/rightSidePanel/errors/MissingPackGroupRow.test.ts src/components/rightSidePanel/errors/MissingNodeCard.test.ts --run` - `pnpm test:browser:local browser_tests/tests/propertiesPanel/errorsTabMissingNodes.spec.ts --project=chromium` - Pre-commit hook: staged formatting, linting, `pnpm typecheck`, and `pnpm typecheck:browser` ## Screenshots This PR <img width="531" height="598" alt="스크린샷 2026-06-10 오전 1 54 31" src="https://github.com/user-attachments/assets/9c0addeb-92d2-4cef-a4f3-35a87bbad308" /> old (Main) <img width="509" height="807" alt="스크린샷 2026-06-10 오전 1 53 51" src="https://github.com/user-attachments/assets/b8488f73-d8ed-4356-bd4c-fc678ea205f7" />
127 lines
3.7 KiB
TypeScript
127 lines
3.7 KiB
TypeScript
import { expect } from '@playwright/test'
|
|
|
|
import { comfyPageFixture as test } from '@e2e/fixtures/ComfyPage'
|
|
import { TestIds } from '@e2e/fixtures/selectors'
|
|
import { loadWorkflowAndOpenErrorsTab } from '@e2e/fixtures/helpers/ErrorsTabHelper'
|
|
|
|
test.describe('Errors tab - Missing nodes', { tag: ['@ui', '@canvas'] }, () => {
|
|
test.beforeEach(async ({ comfyPage }) => {
|
|
await comfyPage.settings.setSetting(
|
|
'Comfy.RightSidePanel.ShowErrorsTab',
|
|
true
|
|
)
|
|
})
|
|
|
|
test('Should show missing node pack card with guidance', async ({
|
|
comfyPage
|
|
}) => {
|
|
await loadWorkflowAndOpenErrorsTab(comfyPage, 'missing/missing_nodes')
|
|
|
|
const missingNodeGroup = comfyPage.page.getByTestId(
|
|
TestIds.dialogs.missingNodePacksGroup
|
|
)
|
|
|
|
await expect(
|
|
comfyPage.page.getByTestId(TestIds.dialogs.missingNodeCard)
|
|
).toBeVisible()
|
|
await expect(missingNodeGroup).toBeVisible()
|
|
await expect(
|
|
missingNodeGroup.getByTestId(TestIds.dialogs.errorGroupDisplayMessage)
|
|
).toHaveText(/\S/)
|
|
})
|
|
|
|
test('Should show unknown pack node rows by default', async ({
|
|
comfyPage
|
|
}) => {
|
|
await loadWorkflowAndOpenErrorsTab(comfyPage, 'missing/missing_nodes')
|
|
|
|
const missingNodeCard = comfyPage.page.getByTestId(
|
|
TestIds.dialogs.missingNodeCard
|
|
)
|
|
await expect(missingNodeCard.getByText('Unknown pack')).toBeVisible()
|
|
await expect(
|
|
missingNodeCard.getByRole('button', { name: 'UNKNOWN NODE' })
|
|
).toBeVisible()
|
|
})
|
|
|
|
test('Should show subgraph missing node rows by default', async ({
|
|
comfyPage
|
|
}) => {
|
|
await loadWorkflowAndOpenErrorsTab(
|
|
comfyPage,
|
|
'missing/missing_nodes_in_subgraph'
|
|
)
|
|
|
|
const missingNodeCard = comfyPage.page.getByTestId(
|
|
TestIds.dialogs.missingNodeCard
|
|
)
|
|
await expect(
|
|
missingNodeCard.getByRole('button', {
|
|
name: 'MISSING_NODE_TYPE_IN_SUBGRAPH'
|
|
})
|
|
).toBeVisible()
|
|
})
|
|
|
|
test('Should locate missing node from the row label', async ({
|
|
comfyPage
|
|
}) => {
|
|
await loadWorkflowAndOpenErrorsTab(comfyPage, 'missing/missing_nodes')
|
|
|
|
const missingNodeCard = comfyPage.page.getByTestId(
|
|
TestIds.dialogs.missingNodeCard
|
|
)
|
|
await comfyPage.canvasOps.pan({ x: -800, y: -800 })
|
|
const offsetBeforeLocate = await comfyPage.canvasOps.getOffset()
|
|
|
|
await missingNodeCard.getByRole('button', { name: 'UNKNOWN NODE' }).click()
|
|
|
|
await expect
|
|
.poll(() => comfyPage.canvasOps.getOffset())
|
|
.not.toEqual(offsetBeforeLocate)
|
|
})
|
|
|
|
test('Should toggle grouped pack nodes from chevron and title', async ({
|
|
comfyPage
|
|
}) => {
|
|
await loadWorkflowAndOpenErrorsTab(
|
|
comfyPage,
|
|
'missing/missing_nodes_same_pack'
|
|
)
|
|
|
|
const missingNodeCard = comfyPage.page.getByTestId(
|
|
TestIds.dialogs.missingNodeCard
|
|
)
|
|
const packTitle = missingNodeCard.getByRole('button', {
|
|
name: 'test-missing-node-pack'
|
|
})
|
|
const expandButton = missingNodeCard.getByTestId(
|
|
TestIds.dialogs.missingNodePackExpand
|
|
)
|
|
const firstNode = missingNodeCard.getByRole('button', {
|
|
name: 'TEST_MISSING_PACK_NODE_A'
|
|
})
|
|
const secondNode = missingNodeCard.getByRole('button', {
|
|
name: 'TEST_MISSING_PACK_NODE_B'
|
|
})
|
|
|
|
await expect(packTitle).toBeVisible()
|
|
await expect(
|
|
missingNodeCard.getByTestId(TestIds.dialogs.missingNodePackCount)
|
|
).toHaveText('2')
|
|
await expect(firstNode).toBeHidden()
|
|
await expect(secondNode).toBeHidden()
|
|
|
|
await expandButton.click()
|
|
await expect(firstNode).toBeVisible()
|
|
await expect(secondNode).toBeVisible()
|
|
|
|
await packTitle.click()
|
|
await expect(firstNode).toBeHidden()
|
|
await expect(secondNode).toBeHidden()
|
|
|
|
await packTitle.click()
|
|
await expect(firstNode).toBeVisible()
|
|
await expect(secondNode).toBeVisible()
|
|
})
|
|
})
|