mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-23 06:10:32 +00:00
## Summary Replaces #12164. Right-clicking a Vue node, using the selection toolbox More Options menu, or clicking the selection toolbox Node Info button now opens the right-side Info tab only when the new-menu UI makes that panel available. Legacy-menu contexts hide the no-op action even when the legacy node library design is selected; node-library help remains isolated to the node library itself. The existing `selection_toolbox_node_info_opened` telemetry fires only after the toolbox button successfully opens node info. No new context-menu telemetry event is added in this PR. ## Changes - **What**: Share the node-info availability/action path across the context menu and selection toolbox, keep legacy-menu state out of the right-side panel public store API, tighten node-info settings tests, and add unit plus E2E regression coverage for new-menu and legacy-menu modes. - **Dependencies**: None ## Review Focus Confirm the node context menu, selection toolbox direct Info button, and selection toolbox More Options entry all respect right-side panel availability, including legacy menu + legacy node library mode, while node-library help behavior remains isolated to the node library. ## Validation - Self-review: checked production path, unit mocks, and Playwright coverage; only gap found was weak E2E coverage for the toolbox direct Info path, now strengthened. - `pnpm test:unit -- src/composables/graph/useSelectionState.test.ts src/components/graph/SelectionToolbox.test.ts src/components/graph/selectionToolbox/InfoButton.test.ts` - `pnpm test:browser:local -- --project=chromium browser_tests/tests/selectionToolboxActions.spec.ts browser_tests/tests/selectionToolboxSubmenus.spec.ts browser_tests/tests/vueNodes/interactions/node/contextMenu.spec.ts --grep "info button opens the right-side info tab|info button is hidden|hides Node Info|should open node info"` - `pnpm typecheck:browser` - `pnpm exec oxlint --type-aware browser_tests/tests/selectionToolboxActions.spec.ts` - `pnpm exec eslint --cache --no-warn-ignored browser_tests/tests/selectionToolboxActions.spec.ts` - `pnpm exec oxfmt --check browser_tests/tests/selectionToolboxActions.spec.ts` - `git diff --check` - Commit hooks: lint-staged + `pnpm typecheck` + `pnpm typecheck:browser` - Push hook: `knip --cache` (existing tag hint only) ## Screenshots (if applicable) Before https://github.com/user-attachments/assets/4b1f6ddb-a01c-4958-81ab-36167f434e59 https://github.com/user-attachments/assets/83433f0d-24f1-46b7-a81d-f0f065812496 After https://github.com/user-attachments/assets/30bd61e5-f8d4-48b7-97e0-26c93e3cb362 https://github.com/user-attachments/assets/afce9f51-a43d-434f-a006-6b357a61ac8f --------- Co-authored-by: github-actions <github-actions@github.com>
82 lines
2.0 KiB
TypeScript
82 lines
2.0 KiB
TypeScript
import { render, screen } from '@testing-library/vue'
|
|
import userEvent from '@testing-library/user-event'
|
|
import PrimeVue from 'primevue/config'
|
|
import Tooltip from 'primevue/tooltip'
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { createI18n } from 'vue-i18n'
|
|
|
|
import InfoButton from '@/components/graph/selectionToolbox/InfoButton.vue'
|
|
import Button from '@/components/ui/button/Button.vue'
|
|
|
|
const { openNodeInfoMock, trackUiButtonClickedMock } = vi.hoisted(() => ({
|
|
openNodeInfoMock: vi.fn(),
|
|
trackUiButtonClickedMock: vi.fn()
|
|
}))
|
|
|
|
vi.mock('@/composables/graph/useSelectionState', () => ({
|
|
useSelectionState: () => ({
|
|
openNodeInfo: openNodeInfoMock
|
|
})
|
|
}))
|
|
|
|
vi.mock('@/platform/telemetry', () => ({
|
|
useTelemetry: () => ({
|
|
trackUiButtonClicked: trackUiButtonClickedMock
|
|
})
|
|
}))
|
|
|
|
describe('InfoButton', () => {
|
|
const i18n = createI18n({
|
|
legacy: false,
|
|
locale: 'en',
|
|
messages: {
|
|
en: {
|
|
g: {
|
|
info: 'Node Info'
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
openNodeInfoMock.mockReturnValue(true)
|
|
})
|
|
|
|
const renderComponent = () => {
|
|
return render(InfoButton, {
|
|
global: {
|
|
plugins: [i18n, PrimeVue],
|
|
directives: { tooltip: Tooltip },
|
|
components: { Button }
|
|
}
|
|
})
|
|
}
|
|
|
|
const clickNodeInfoButton = async () => {
|
|
const user = userEvent.setup()
|
|
await user.click(screen.getByRole('button', { name: 'Node Info' }))
|
|
}
|
|
|
|
it('should open the node info panel on click', async () => {
|
|
renderComponent()
|
|
|
|
await clickNodeInfoButton()
|
|
|
|
expect(openNodeInfoMock).toHaveBeenCalled()
|
|
expect(trackUiButtonClickedMock).toHaveBeenCalledWith({
|
|
button_id: 'selection_toolbox_node_info_opened'
|
|
})
|
|
})
|
|
|
|
it('should not track the click when the node info panel is unavailable', async () => {
|
|
openNodeInfoMock.mockReturnValue(false)
|
|
renderComponent()
|
|
|
|
await clickNodeInfoButton()
|
|
|
|
expect(openNodeInfoMock).toHaveBeenCalled()
|
|
expect(trackUiButtonClickedMock).not.toHaveBeenCalled()
|
|
})
|
|
})
|