diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_de_DE.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_de_DE.json index 3f3f8f35b761..360ed8e88917 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_de_DE.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_de_DE.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "Sie haben kein Backup", "pci_instances_dashboard_backup_title": "Verwaltung des Backups", "pci_instances_dashboard_backup_number_of_backups": "Anzahl der Backups der Instanz", - "pci_instances_dashboard_backup_last_updated_backups": "Datum des letzten Backups" + "pci_instances_dashboard_backup_last_updated_backups": "Datum des letzten Backups", + "pci_instances_dashboard_tab_vnc_disabled_text": "Der Status dieser Instanz erlaubt keine Verbindung über die VNC-Konsole." } diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_en_GB.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_en_GB.json index e8d657b6a5ff..61010c2f324b 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_en_GB.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_en_GB.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "You do not have a backup", "pci_instances_dashboard_backup_title": "Backup management", "pci_instances_dashboard_backup_number_of_backups": "Instance backup count", - "pci_instances_dashboard_backup_last_updated_backups": "Date of last backup" + "pci_instances_dashboard_backup_last_updated_backups": "Date of last backup", + "pci_instances_dashboard_tab_vnc_disabled_text": "The state of this instance does not allow connection via the VNC console." } diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_es_ES.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_es_ES.json index d36d1be5edb7..03a3f75f28c9 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_es_ES.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_es_ES.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "No tiene backup", "pci_instances_dashboard_backup_title": "Gestión del backup", "pci_instances_dashboard_backup_number_of_backups": "Número de backups de la instancia", - "pci_instances_dashboard_backup_last_updated_backups": "Fecha del último backup" + "pci_instances_dashboard_backup_last_updated_backups": "Fecha del último backup", + "pci_instances_dashboard_tab_vnc_disabled_text": "El estado de esta instancia no permite la conexión a través de la consola VNC" } diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_CA.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_CA.json index c5ea654d14ba..f9de5f042157 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_CA.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_CA.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "Vous n'avez pas de backup", "pci_instances_dashboard_backup_title": "Gestion du backup", "pci_instances_dashboard_backup_number_of_backups": "Nombre de backups de l'instance", - "pci_instances_dashboard_backup_last_updated_backups": "Date du dernier backup" + "pci_instances_dashboard_backup_last_updated_backups": "Date du dernier backup", + "pci_instances_dashboard_tab_vnc_disabled_text": "L'état de cette instance ne permet pas la connexion via la console VNC" } diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_FR.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_FR.json index c5ea654d14ba..f9de5f042157 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_FR.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_fr_FR.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "Vous n'avez pas de backup", "pci_instances_dashboard_backup_title": "Gestion du backup", "pci_instances_dashboard_backup_number_of_backups": "Nombre de backups de l'instance", - "pci_instances_dashboard_backup_last_updated_backups": "Date du dernier backup" + "pci_instances_dashboard_backup_last_updated_backups": "Date du dernier backup", + "pci_instances_dashboard_tab_vnc_disabled_text": "L'état de cette instance ne permet pas la connexion via la console VNC" } diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_it_IT.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_it_IT.json index 12a9b2854b79..0a69d48fe059 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_it_IT.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_it_IT.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "Non hai backup", "pci_instances_dashboard_backup_title": "Gestione del backup", "pci_instances_dashboard_backup_number_of_backups": "Numero di backup dell’istanza", - "pci_instances_dashboard_backup_last_updated_backups": "Data dell'ultimo backup" + "pci_instances_dashboard_backup_last_updated_backups": "Data dell'ultimo backup", + "pci_instances_dashboard_tab_vnc_disabled_text": "Lo stato di questa istanza non consente la connessione tramite la console VNC" } diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pl_PL.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pl_PL.json index 6d9a8926c051..a6aa9f3f734d 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pl_PL.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pl_PL.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "Nie posiadasz kopii zapasowej", "pci_instances_dashboard_backup_title": "Zarządzanie kopiami zapasowymi", "pci_instances_dashboard_backup_number_of_backups": "Liczba kopii zapasowych instancji", - "pci_instances_dashboard_backup_last_updated_backups": "Data ostatniego backupu" + "pci_instances_dashboard_backup_last_updated_backups": "Data ostatniego backupu", + "pci_instances_dashboard_tab_vnc_disabled_text": "Stan tej instancji nie pozwala na połączenie przez konsolę VNC." } diff --git a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pt_PT.json b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pt_PT.json index e40268e85ad8..dfb650162dfe 100644 --- a/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pt_PT.json +++ b/packages/manager/apps/pci-instances/public/translations/dashboard/Messages_pt_PT.json @@ -30,5 +30,6 @@ "pci_instances_dashboard_backup_empty_message": "Não possui backups", "pci_instances_dashboard_backup_title": "Gestão do backup", "pci_instances_dashboard_backup_number_of_backups": "Número de backups da instância", - "pci_instances_dashboard_backup_last_updated_backups": "Data do último backup" + "pci_instances_dashboard_backup_last_updated_backups": "Data do último backup", + "pci_instances_dashboard_tab_vnc_disabled_text": "O estado desta instância não permite a conexão via console VNC" } diff --git a/packages/manager/apps/pci-instances/src/components/tab/TabsPanel.component.tsx b/packages/manager/apps/pci-instances/src/components/tab/TabsPanel.component.tsx index 4b9e76a14652..27874c15d283 100644 --- a/packages/manager/apps/pci-instances/src/components/tab/TabsPanel.component.tsx +++ b/packages/manager/apps/pci-instances/src/components/tab/TabsPanel.component.tsx @@ -1,11 +1,21 @@ import { FC, useEffect, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Tabs, TabList, Tab, TabsValueChangeEvent } from '@ovhcloud/ods-react'; +import { + Tabs, + TabList, + Tab, + TabsValueChangeEvent, + Tooltip, + TooltipTrigger, + TooltipContent, +} from '@ovhcloud/ods-react'; type TTabItem = { label: string; to: string; badge?: string; + disabled?: boolean; + tooltipText?: string | null; }; type TTabsPanelProps = { @@ -30,9 +40,16 @@ const TabsPanel: FC = ({ tabs }) => { {tabs.map((tab) => ( - - {tab.label} - + + + + {tab.label} + + + {tab.tooltipText && ( + {tab.tooltipText} + )} + ))} diff --git a/packages/manager/apps/pci-instances/src/data/hooks/instance/selectors/instances.selector.ts b/packages/manager/apps/pci-instances/src/data/hooks/instance/selectors/instances.selector.ts index 59ed51e92e1c..1e86102ca8c9 100644 --- a/packages/manager/apps/pci-instances/src/data/hooks/instance/selectors/instances.selector.ts +++ b/packages/manager/apps/pci-instances/src/data/hooks/instance/selectors/instances.selector.ts @@ -120,21 +120,27 @@ const mapInstanceAddresses = (instance: TAggregatedInstanceDto) => return acc.set(type, [rest]); }, new Map()); +const isActionToDisplay = (name: TActionName) => name !== 'vnc'; + const mapInstanceActions = ( instance: TAggregatedInstanceDto, projectUrl: string, ): TAggregatedInstanceActions => instance.actions.reduce((acc, action) => { const { group, name } = action; - const newAction = { - label: `pci_instances_list_action_${name}`, - link: getActionHrefByName(projectUrl, name, instance), - }; - const foundAction = acc.get(group); - if (!foundAction) return acc.set(group, [newAction]); - foundAction.push(newAction); + + if (isActionToDisplay(name)) { + const newAction = { + label: `pci_instances_list_action_${name}`, + link: getActionHrefByName(projectUrl, name, instance), + }; + const foundAction = acc.get(group); + if (!foundAction) return acc.set(group, [newAction]); + foundAction.push(newAction); + } + return acc; - }, new Map() as TAggregatedInstanceActions); + }, new Map()); export const instancesSelector = ( { pages }: InfiniteData, diff --git a/packages/manager/apps/pci-instances/src/pages/instances/instance/Instance.page.tsx b/packages/manager/apps/pci-instances/src/pages/instances/instance/Instance.page.tsx index 820dd76f5de3..20984296bab6 100644 --- a/packages/manager/apps/pci-instances/src/pages/instances/instance/Instance.page.tsx +++ b/packages/manager/apps/pci-instances/src/pages/instances/instance/Instance.page.tsx @@ -32,24 +32,23 @@ const Instance: FC = () => { instanceId, }); - const tabs = useMemo(() => { - const defaultTab = [ + const tabs = useMemo( + () => [ { label: t('general_information'), to: dashboardPath.pathname, }, - ]; - - return instance?.isEditEnabled - ? [ - ...defaultTab, - { - label: t('dashboard:pci_instances_dashboard_tab_vnc_title'), - to: vncPath.pathname, - }, - ] - : defaultTab; - }, [dashboardPath.pathname, vncPath.pathname, t, instance?.isEditEnabled]); + { + label: t('dashboard:pci_instances_dashboard_tab_vnc_title'), + to: vncPath.pathname, + disabled: !instance?.isVncEnabled, + tooltipText: !instance?.isVncEnabled + ? t('dashboard:pci_instances_dashboard_tab_vnc_disabled_text') + : null, + }, + ], + [dashboardPath.pathname, vncPath.pathname, t, instance?.isVncEnabled], + ); return ( diff --git a/packages/manager/apps/pci-instances/src/pages/instances/instance/dashboard/view-models/selectInstanceDashboard.ts b/packages/manager/apps/pci-instances/src/pages/instances/instance/dashboard/view-models/selectInstanceDashboard.ts index 3818ff6dc150..a119b848dfa2 100644 --- a/packages/manager/apps/pci-instances/src/pages/instances/instance/dashboard/view-models/selectInstanceDashboard.ts +++ b/packages/manager/apps/pci-instances/src/pages/instances/instance/dashboard/view-models/selectInstanceDashboard.ts @@ -71,11 +71,15 @@ export type TInstanceDashboardViewModel = { isDeleteEnabled: boolean; isEditEnabled: boolean; isBackupEnabled: boolean; + isVncEnabled: boolean; } | null; const isEditionEnabled = (actions: TInstanceAction[]) => actions.some(({ name }) => name === 'edit'); +const isVncEnabled = (actions: TInstanceAction[]) => + actions.some(({ name }) => name === 'vnc'); + const mapFlavor = ({ name, specs }: TInstanceFlavor) => ({ name, ram: specs ? `${specs.ram.value} ${specs.ram.unit}` : '-', @@ -187,6 +191,7 @@ const isAdditionalAction = ({ name }: { name: TActionName }) => { 'delete', 'activate_monthly_billing', 'create_backup', + 'vnc', ]; return !excludeActions.includes(name); @@ -299,5 +304,6 @@ export const selectInstanceDashboard = ( isDeleteEnabled: canDeleteInstance(instance.actions), isEditEnabled: isEditionEnabled(instance.actions), isBackupEnabled: canCreateBackup(instance.actions), + isVncEnabled: isVncEnabled(instance.actions), }; }; diff --git a/packages/manager/apps/pci-instances/src/types/instance/common.type.ts b/packages/manager/apps/pci-instances/src/types/instance/common.type.ts index b51aa22f86b2..2a5c73f8021d 100644 --- a/packages/manager/apps/pci-instances/src/types/instance/common.type.ts +++ b/packages/manager/apps/pci-instances/src/types/instance/common.type.ts @@ -15,7 +15,8 @@ export type TActionName = | 'unshelve' | 'resume' | 'reinstall' - | 'delete'; + | 'delete' + | 'vnc'; export type TStatus = | 'ACTIVE'