From 54cdb5cd43cae0162f533221a1f4e0bd74dce66a Mon Sep 17 00:00:00 2001 From: Luca Stocchi <49404737+lstocchi@users.noreply.github.com> Date: Tue, 9 Apr 2024 18:11:28 +0200 Subject: [PATCH] feat: add navigateTo resources and edit container connection (#6733) * feat: add navigateTo resources and edit container connection Signed-off-by: lstocchi --- packages/extension-api/src/extension-api.d.ts | 9 ++++ .../main/src/plugin/extension-loader.spec.ts | 1 + packages/main/src/plugin/extension-loader.ts | 8 ++++ packages/main/src/plugin/index.ts | 1 + .../navigation/navigation-manager.spec.ts | 46 ++++++++++++++++++- .../plugin/navigation/navigation-manager.ts | 21 +++++++++ .../src/plugin/navigation/navigation-page.ts | 2 + packages/renderer/src/navigation.spec.ts | 12 +++++ packages/renderer/src/navigation.ts | 6 +++ 9 files changed, 105 insertions(+), 1 deletion(-) diff --git a/packages/extension-api/src/extension-api.d.ts b/packages/extension-api/src/extension-api.d.ts index 825cb23a322..625bb206ed1 100644 --- a/packages/extension-api/src/extension-api.d.ts +++ b/packages/extension-api/src/extension-api.d.ts @@ -4175,6 +4175,15 @@ declare module '@podman-desktop/api' { * Navigate to Authentication settings page */ export function navigateToAuthentication(): Promise; + + /** + * Navigate to Resources page + */ + export function navigateToResources(): Promise; + /** + * Navigate to the Edit Provider Container Connection page + */ + export function navigateToEditProviderContainerConnection(connection: ProviderContainerConnection): Promise; } /** diff --git a/packages/main/src/plugin/extension-loader.spec.ts b/packages/main/src/plugin/extension-loader.spec.ts index bdd1fa392af..0b11a83d4f4 100644 --- a/packages/main/src/plugin/extension-loader.spec.ts +++ b/packages/main/src/plugin/extension-loader.spec.ts @@ -212,6 +212,7 @@ const navigationManager: NavigationManager = new NavigationManager( apiSender, containerProviderRegistry, contributionManager, + providerRegistry, webviewRegistry, ); diff --git a/packages/main/src/plugin/extension-loader.ts b/packages/main/src/plugin/extension-loader.ts index b04ef13f75c..1e9b51bdf38 100644 --- a/packages/main/src/plugin/extension-loader.ts +++ b/packages/main/src/plugin/extension-loader.ts @@ -1224,6 +1224,14 @@ export class ExtensionLoader { navigateToAuthentication: async (): Promise => { await this.navigationManager.navigateToAuthentication(); }, + navigateToResources: async (): Promise => { + await this.navigationManager.navigateToResources(); + }, + navigateToEditProviderContainerConnection: async ( + connection: containerDesktopAPI.ProviderContainerConnection, + ): Promise => { + await this.navigationManager.navigateToEditProviderContainerConnection(connection); + }, }; const version = app.getVersion(); diff --git a/packages/main/src/plugin/index.ts b/packages/main/src/plugin/index.ts index 282a2505b6b..0ce983fac5a 100644 --- a/packages/main/src/plugin/index.ts +++ b/packages/main/src/plugin/index.ts @@ -584,6 +584,7 @@ export class PluginSystem { apiSender, containerProviderRegistry, contributionManager, + providerRegistry, webviewRegistry, ); diff --git a/packages/main/src/plugin/navigation/navigation-manager.spec.ts b/packages/main/src/plugin/navigation/navigation-manager.spec.ts index 2d74fe99d21..801d949f4a1 100644 --- a/packages/main/src/plugin/navigation/navigation-manager.spec.ts +++ b/packages/main/src/plugin/navigation/navigation-manager.spec.ts @@ -16,12 +16,14 @@ * SPDX-License-Identifier: Apache-2.0 ***********************************************************************/ +import type { ProviderContainerConnection } from '@podman-desktop/api'; import { beforeEach, expect, test, vi } from 'vitest'; import type { ApiSenderType } from '../api.js'; import type { WebviewInfo } from '../api/webview-info.js'; import type { ContainerProviderRegistry } from '../container-registry.js'; import type { ContributionManager } from '../contribution-manager.js'; +import type { ProviderRegistry } from '../provider-registry.js'; import type { WebviewRegistry } from '../webview/webview-registry.js'; import { NavigationManager } from './navigation-manager.js'; import { NavigationPage } from './navigation-page.js'; @@ -48,13 +50,23 @@ const contributionManager = { listContributions: vi.fn(), } as unknown as ContributionManager; +const providerRegistry = { + getMatchingProviderInternalId: vi.fn(), +} as unknown as ProviderRegistry; + const webviewRegistry = { listWebviews: vi.fn(), } as unknown as WebviewRegistry; beforeEach(() => { vi.resetAllMocks(); - navigationManager = new TestNavigationManager(apiSender, containerRegistry, contributionManager, webviewRegistry); + navigationManager = new TestNavigationManager( + apiSender, + containerRegistry, + contributionManager, + providerRegistry, + webviewRegistry, + ); }); test('check contribution does not exist', async () => { @@ -89,3 +101,35 @@ test('check navigateToWebview', async () => { }, }); }); + +test('check navigateToResources', async () => { + await navigationManager.navigateToResources(); + + expect(apiSender.send).toHaveBeenCalledWith('navigate', { + page: NavigationPage.RESOURCES, + }); +}); + +test('check navigateToEditProviderContainerConnection', async () => { + vi.mocked(providerRegistry.getMatchingProviderInternalId).mockReturnValue('id'); + const connection: ProviderContainerConnection = { + providerId: 'internal', + connection: { + name: 'connection', + type: 'docker', + endpoint: { + socketPath: '/endpoint1.sock', + }, + status: () => 'stopped', + }, + }; + await navigationManager.navigateToEditProviderContainerConnection(connection); + + expect(apiSender.send).toHaveBeenCalledWith('navigate', { + page: NavigationPage.EDIT_CONTAINER_CONNECTION, + parameters: { + provider: 'id', + name: Buffer.from(connection.connection.name).toString('base64'), + }, + }); +}); diff --git a/packages/main/src/plugin/navigation/navigation-manager.ts b/packages/main/src/plugin/navigation/navigation-manager.ts index 68c9d8b10cf..71c900042a1 100644 --- a/packages/main/src/plugin/navigation/navigation-manager.ts +++ b/packages/main/src/plugin/navigation/navigation-manager.ts @@ -16,12 +16,15 @@ * SPDX-License-Identifier: Apache-2.0 ***********************************************************************/ +import type { ProviderContainerConnection } from '@podman-desktop/api'; + import type { ApiSenderType } from '/@/plugin/api.js'; import type { ContainerProviderRegistry } from '/@/plugin/container-registry.js'; import type { ContributionManager } from '/@/plugin/contribution-manager.js'; import { NavigationPage } from '/@/plugin/navigation/navigation-page.js'; import type { NavigationRequest } from '/@/plugin/navigation/navigation-request.js'; +import type { ProviderRegistry } from '../provider-registry.js'; import type { WebviewRegistry } from '../webview/webview-registry.js'; export class NavigationManager { @@ -29,6 +32,7 @@ export class NavigationManager { private apiSender: ApiSenderType, private containerRegistry: ContainerProviderRegistry, private contributionManager: ContributionManager, + private providerRegistry: ProviderRegistry, private webviewRegistry: WebviewRegistry, ) {} @@ -213,4 +217,21 @@ export class NavigationManager { page: NavigationPage.AUTHENTICATION, }); } + + async navigateToResources(): Promise { + this.navigateTo({ + page: NavigationPage.RESOURCES, + }); + } + + async navigateToEditProviderContainerConnection(connection: ProviderContainerConnection): Promise { + const internalId = this.providerRegistry.getMatchingProviderInternalId(connection.providerId); + this.navigateTo({ + page: NavigationPage.EDIT_CONTAINER_CONNECTION, + parameters: { + provider: internalId, + name: Buffer.from(connection.connection.name).toString('base64'), + }, + }); + } } diff --git a/packages/main/src/plugin/navigation/navigation-page.ts b/packages/main/src/plugin/navigation/navigation-page.ts index 6230c08f33e..8e85541af1b 100644 --- a/packages/main/src/plugin/navigation/navigation-page.ts +++ b/packages/main/src/plugin/navigation/navigation-page.ts @@ -33,4 +33,6 @@ export enum NavigationPage { HELP = 'help', WEBVIEW = 'webview', AUTHENTICATION = 'authentication', + RESOURCES = 'resources', + EDIT_CONTAINER_CONNECTION = 'edit-container-connection', } diff --git a/packages/renderer/src/navigation.spec.ts b/packages/renderer/src/navigation.spec.ts index d610a49af15..e6a8e6e1c9b 100644 --- a/packages/renderer/src/navigation.spec.ts +++ b/packages/renderer/src/navigation.spec.ts @@ -42,3 +42,15 @@ test('Test navigationHandle to a specific webview', () => { expect(vi.mocked(router.goto)).toHaveBeenCalledWith('/webviews/123'); }); + +test('Test navigationHandle to resources page', () => { + handleNavigation(NavigationPage.RESOURCES); + + expect(vi.mocked(router.goto)).toHaveBeenCalledWith('/preferences/resources'); +}); + +test('Test navigationHandle to a specific edit page', () => { + handleNavigation(NavigationPage.EDIT_CONTAINER_CONNECTION, { provider: '123', name: 'test' }); + + expect(vi.mocked(router.goto)).toHaveBeenCalledWith('/preferences/container-connection/edit/123/test'); +}); diff --git a/packages/renderer/src/navigation.ts b/packages/renderer/src/navigation.ts index 97ba8dd1eb0..d2d017d84ea 100644 --- a/packages/renderer/src/navigation.ts +++ b/packages/renderer/src/navigation.ts @@ -82,5 +82,11 @@ export const handleNavigation = (page: NavigationPage, parameters?: { [key: stri case NavigationPage.AUTHENTICATION: router.goto('/preferences/authentication-providers'); break; + case NavigationPage.RESOURCES: + router.goto('/preferences/resources'); + break; + case NavigationPage.EDIT_CONTAINER_CONNECTION: + router.goto(`/preferences/container-connection/edit/${parameters?.['provider']}/${parameters?.['name']}`); + break; } };