diff --git a/src/views/states/list/StatesList.tsx b/src/views/states/list/StatesList.tsx index 3039c1ff..781e4630 100644 --- a/src/views/states/list/StatesList.tsx +++ b/src/views/states/list/StatesList.tsx @@ -22,12 +22,13 @@ import { paginationDefaultValues } from '@utils/hooks/usePagination/utils/consta import InterfaceDrawer from './components/InterfaceDrawer/InterfaceDrawer'; import StateRow from './components/StateRow'; import StatusBox from './components/StatusBox'; -import { DrawerContextProvider } from './contexts/DrawerContext'; +import useDrawerInterface from './hooks/useDrawerInterface'; import useStateColumns from './hooks/useStateColumns'; import useStateFilters from './hooks/useStateFilters'; const StatesList: FC = () => { const { t } = useNMStateTranslation(); + const { selectedInterfaceName, selectedStateName, selectedInterfaceType } = useDrawerInterface(); const [states, statesLoaded, statesError] = useK8sWatchResource({ groupVersionKind: NodeNetworkStateModelGroupVersionKind, @@ -36,6 +37,11 @@ const StatesList: FC = () => { }); const { onPaginationChange, pagination } = usePagination(); + const selectedState = states?.find((state) => state.metadata.name === selectedStateName); + const selectedInterface = selectedState?.status?.currentState?.interfaces?.find( + (iface) => iface.name === selectedInterfaceName && iface.type === selectedInterfaceType, + ); + const [columns, activeColumns] = useStateColumns(); const filters = useStateFilters(); const [data, filteredData, onFilterChange] = useListPageFilter(states, filters); @@ -43,7 +49,7 @@ const StatesList: FC = () => { const paginatedData = filteredData.slice(pagination?.startIndex, pagination?.endIndex + 1); return ( - + <> @@ -106,8 +112,8 @@ const StatesList: FC = () => { - - + + ); }; diff --git a/src/views/states/list/components/InterfaceDrawer/InterfaceDrawer.tsx b/src/views/states/list/components/InterfaceDrawer/InterfaceDrawer.tsx index 37c52e3d..fcc56901 100644 --- a/src/views/states/list/components/InterfaceDrawer/InterfaceDrawer.tsx +++ b/src/views/states/list/components/InterfaceDrawer/InterfaceDrawer.tsx @@ -1,21 +1,24 @@ import React, { FC, useCallback } from 'react'; import { Modal, Title } from '@patternfly/react-core'; +import { NodeNetworkConfigurationInterface } from '@types'; import { useNMStateTranslation } from '@utils/hooks/useNMStateTranslation'; -import { useDrawerContext } from '../../contexts/DrawerContext'; +import useDrawerInterface from '../../hooks/useDrawerInterface'; import { InterfaceDrawerTabId, InterfaceDrawerTabProps } from './constants'; import InterfaceDrawerDetailsTab from './InterfaceDrawerDetailsTab'; import InterfaceDrawerYAMLFooter from './InterfaceDrawerFooter'; import InterfaceDrawerYAMLTab from './InterfaceDrawerYAMLTab'; -const InterfaceDrawer: FC = () => { +const InterfaceDrawer: FC<{ selectedInterface: NodeNetworkConfigurationInterface }> = ({ + selectedInterface, +}) => { const { t } = useNMStateTranslation(); - const { selectedInterface, setSelectedInterface } = useDrawerContext(); + const { setSelectedInterfaceName } = useDrawerInterface(); const onClose = useCallback(() => { - setSelectedInterface(null); + setSelectedInterfaceName(); }, []); const Tabs: InterfaceDrawerTabProps[] = [ @@ -61,7 +64,10 @@ const InterfaceDrawer: FC = () => { }`} data-test={`horizontal-tab-${tab.id}`} > - + {tab.title} diff --git a/src/views/states/list/components/InterfacesPopoverBody.tsx b/src/views/states/list/components/InterfacesPopoverBody.tsx index e40956cd..85ead1c7 100644 --- a/src/views/states/list/components/InterfacesPopoverBody.tsx +++ b/src/views/states/list/components/InterfacesPopoverBody.tsx @@ -1,4 +1,6 @@ import React, { FC, useCallback } from 'react'; +import { useHistory } from 'react-router'; +import NodeNetworkStateModel from 'src/console-models/NodeNetworkStateModel'; import { Button, @@ -11,8 +13,7 @@ import { } from '@patternfly/react-core'; import { LongArrowAltDownIcon, LongArrowAltUpIcon } from '@patternfly/react-icons'; import { NodeNetworkConfigurationInterface } from '@types'; - -import { useDrawerContext } from '../contexts/DrawerContext'; +import { getResourceUrl } from '@utils/helpers'; import './interfaces-popover-body.scss'; @@ -26,14 +27,21 @@ const FirstColumn = ({ children }) => {ch const SecondColumn = ({ children }) => {children}; const InterfacesPopoverBody: FC = ({ interfaces, hide }) => { - const { setSelectedInterface } = useDrawerContext(); + const history = useHistory(); const onInterfaceNameClick = useCallback( (iface: NodeNetworkConfigurationInterface) => { - setSelectedInterface(iface); + const baseListUrl = getResourceUrl({ model: NodeNetworkStateModel }); + + const query = new URLSearchParams({ + selectedInterface: iface.name, + }); + + history.push(`${baseListUrl}?${query.toString()}`); + hide(); }, - [hide, setSelectedInterface], + [hide], ); return ( diff --git a/src/views/states/list/components/InterfacesTable.tsx b/src/views/states/list/components/InterfacesTable.tsx index a1a4f8c9..c9ca7445 100644 --- a/src/views/states/list/components/InterfacesTable.tsx +++ b/src/views/states/list/components/InterfacesTable.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react'; import { Table, TableGridBreakpoint, TableHeader, Tbody } from '@patternfly/react-table'; -import { NodeNetworkConfigurationInterface } from '@types'; +import { NodeNetworkConfigurationInterface, V1beta1NodeNetworkState } from '@types'; import useInterfaceColumns from '../hooks/useInterfaceColumns'; @@ -11,9 +11,10 @@ import './interfaces-table.scss'; interface InterfacesTableProps { interfacesByType: { [interfaceType in string]: NodeNetworkConfigurationInterface[] }; + nodeNetworkState: V1beta1NodeNetworkState; } -const InterfacesTable: FC = ({ interfacesByType }) => { +const InterfacesTable: FC = ({ interfacesByType, nodeNetworkState }) => { const columns = useInterfaceColumns(); return ( @@ -30,6 +31,7 @@ const InterfacesTable: FC = ({ interfacesByType }) => { key={interfaceType} interfaceType={interfaceType} interfaces={interfacesByType[interfaceType]} + nodeNetworkState={nodeNetworkState} /> ))} diff --git a/src/views/states/list/components/InterfacesTypeSection.tsx b/src/views/states/list/components/InterfacesTypeSection.tsx index cc4993cc..3d09c85a 100644 --- a/src/views/states/list/components/InterfacesTypeSection.tsx +++ b/src/views/states/list/components/InterfacesTypeSection.tsx @@ -11,22 +11,23 @@ import { } from '@patternfly/react-core'; import { LongArrowAltDownIcon, LongArrowAltUpIcon } from '@patternfly/react-icons'; import { Td, Tr } from '@patternfly/react-table'; -import { NodeNetworkConfigurationInterface } from '@types'; +import { NodeNetworkConfigurationInterface, V1beta1NodeNetworkState } from '@types'; -import { useDrawerContext } from '../contexts/DrawerContext'; +import useDrawerInterface from '../hooks/useDrawerInterface'; import './interfaces-table.scss'; interface InterfacesTypeSectionProps { interfaces: NodeNetworkConfigurationInterface[]; interfaceType: string; + nodeNetworkState: V1beta1NodeNetworkState; } const InterfacesTypeSection: FC = memo( - ({ interfaceType, interfaces }) => { + ({ interfaceType, interfaces, nodeNetworkState }) => { const [isExpanded, setIsExpanded] = useState(false); - const { setSelectedInterface } = useDrawerContext(); + const { setSelectedInterfaceName } = useDrawerInterface(); return ( <> @@ -57,7 +58,7 @@ const InterfacesTypeSection: FC = memo(