diff --git a/packages/main/src/mainWindow.ts b/packages/main/src/mainWindow.ts index 63859f97d7e..19a97b86e62 100644 --- a/packages/main/src/mainWindow.ts +++ b/packages/main/src/mainWindow.ts @@ -231,6 +231,12 @@ async function createWindow(): Promise { append: (_defaultActions, parameters) => { return navigationItemsMenuBuilder?.buildNavigationMenu(parameters) ?? []; }, + onClose: () => { + browserWindow.webContents.send('context-menu:visible', false); + }, + onShow: () => { + browserWindow.webContents.send('context-menu:visible', true); + }, }); // Add help/about menu entry diff --git a/packages/preload/src/index.ts b/packages/preload/src/index.ts index 7229b4d8792..36822a26948 100644 --- a/packages/preload/src/index.ts +++ b/packages/preload/src/index.ts @@ -1456,6 +1456,10 @@ export function initExposure(): void { apiSender.send('dev-tools:open-webview', webviewId); }); + ipcRenderer.on('context-menu:visible', (_, visible: boolean) => { + apiSender.send('context-menu:visible', visible); + }); + // Handle callback on dialogs by calling the callback once we get the answer ipcRenderer.on('dialog:open-save-dialog-response', (_, dialogId: string, result: string | string[] | undefined) => { // grab from stored map diff --git a/packages/renderer/src/App.spec.ts b/packages/renderer/src/App.spec.ts index 59c2e7809ac..aaf03eeb9ad 100644 --- a/packages/renderer/src/App.spec.ts +++ b/packages/renderer/src/App.spec.ts @@ -16,7 +16,7 @@ * SPDX-License-Identifier: Apache-2.0 ***********************************************************************/ -import { render } from '@testing-library/svelte'; +import { render, waitFor } from '@testing-library/svelte'; import { tick } from 'svelte'; import { router } from 'tinro'; import { beforeEach, expect, test, vi } from 'vitest'; @@ -54,9 +54,18 @@ vi.mock('./lib/appearance/Appearance.svelte', () => ({ default: vi.fn(), })); +const dispatchEventMock = vi.fn(); +const messages = new Map void>(); + beforeEach(() => { vi.resetAllMocks(); router.goto('/'); + (window.events as unknown) = { + receive: vi.fn().mockImplementation((channel, func) => { + messages.set(channel, func); + }), + }; + (window as any).dispatchEvent = dispatchEventMock; }); test('test /image/run/* route', async () => { @@ -76,3 +85,27 @@ test('test /images/:id/:engineId route', async () => { await tick(); expect(mocks.ImagesList).toHaveBeenCalled(); }); + +test('receive context menu visible event from main', async () => { + render(App); + // send 'context-menu:visible' event + messages.get('context-menu:visible')?.(true); + + // wait for dispatch method to be called + waitFor(() => expect(dispatchEventMock).toHaveBeenCalledWith(expect.any(Event))); + + const eventSent = vi.mocked(dispatchEventMock).mock.calls[0][0]; + expect((eventSent as Event).type).toBe('tooltip-hide'); +}); + +test('receive context menu not visible event from main', async () => { + render(App); + + messages.get('context-menu:visible')?.(false); + + // wait for dispatch method to be called + waitFor(() => expect(dispatchEventMock).toHaveBeenCalledWith(expect.any(Event))); + + const eventSent = vi.mocked(dispatchEventMock).mock.calls[0][0]; + expect((eventSent as Event).type).toBe('tooltip-show'); +}); diff --git a/packages/renderer/src/App.svelte b/packages/renderer/src/App.svelte index f1001044470..a3dc1442403 100644 --- a/packages/renderer/src/App.svelte +++ b/packages/renderer/src/App.svelte @@ -78,6 +78,14 @@ router.subscribe(function (navigation) { } }); +window.events?.receive('context-menu:visible', visible => { + if (visible) { + window.dispatchEvent(new Event('tooltip-hide')); + } else { + window.dispatchEvent(new Event('tooltip-show')); + } +}); + window.events?.receive('navigate', (navigationRequest: unknown) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any handleNavigation(navigationRequest as NavigationRequest); diff --git a/packages/ui/src/lib/dropdownMenu/DropDownMenuItems.svelte b/packages/ui/src/lib/dropdownMenu/DropDownMenuItems.svelte index 75488ca2192..7e806e921a3 100644 --- a/packages/ui/src/lib/dropdownMenu/DropDownMenuItems.svelte +++ b/packages/ui/src/lib/dropdownMenu/DropDownMenuItems.svelte @@ -1,5 +1,5 @@ diff --git a/packages/ui/src/lib/tooltip/Tooltip.spec.ts b/packages/ui/src/lib/tooltip/Tooltip.spec.ts new file mode 100644 index 00000000000..ab7ea832cdd --- /dev/null +++ b/packages/ui/src/lib/tooltip/Tooltip.spec.ts @@ -0,0 +1,41 @@ +/********************************************************************** + * Copyright (C) 2024 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import '@testing-library/jest-dom/vitest'; + +import { render, screen } from '@testing-library/svelte'; +import { tick } from 'svelte'; +import { expect, test } from 'vitest'; + +import Tooltip from './Tooltip.svelte'; +import { tooltipHidden } from './tooltip-store'; + +test('tooltip is not empty string when tooltipHidden value false', async () => { + tooltipHidden.set(false); + + render(Tooltip, { tip: 'test 1' }); + expect(screen.queryByText('test 1')).toBeInTheDocument(); + + tooltipHidden.set(true); + await tick(); + expect(screen.queryByText('test 1')).not.toBeInTheDocument(); + + tooltipHidden.set(false); + await tick(); + expect(screen.queryByText('test 1')).toBeInTheDocument(); +}); diff --git a/packages/ui/src/lib/tooltip/Tooltip.svelte b/packages/ui/src/lib/tooltip/Tooltip.svelte index 37bdea17953..89ddd5417ad 100644 --- a/packages/ui/src/lib/tooltip/Tooltip.svelte +++ b/packages/ui/src/lib/tooltip/Tooltip.svelte @@ -50,6 +50,8 @@