diff --git a/packages/demo-app-ts/src/App.tsx b/packages/demo-app-ts/src/App.tsx index 933448ec..9306f5a7 100755 --- a/packages/demo-app-ts/src/App.tsx +++ b/packages/demo-app-ts/src/App.tsx @@ -1,4 +1,4 @@ -import { createElement } from 'react'; +import { createElement, Component } from 'react'; import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom'; import { Page, @@ -35,7 +35,7 @@ interface AppState { isDarkTheme: boolean; } -class App extends React.Component<{}, AppState> { +class App extends Component<{}, AppState> { state: AppState = { activeItem: Demos.reduce( (active, demo) => active || (demo.isDefault ? demo.id : demo.demos?.find((subDemo) => subDemo.isDefault)?.id), diff --git a/packages/demo-app-ts/src/demos/topologyPackageDemo/TopologyPackage.tsx b/packages/demo-app-ts/src/demos/topologyPackageDemo/TopologyPackage.tsx index fee1e3e5..a083681c 100644 --- a/packages/demo-app-ts/src/demos/topologyPackageDemo/TopologyPackage.tsx +++ b/packages/demo-app-ts/src/demos/topologyPackageDemo/TopologyPackage.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useContext } from 'react'; +import { useState, useEffect, useContext, FunctionComponent, MouseEvent as ReactMouseEvent } from 'react'; import { Tab, Tabs, TabTitleText } from '@patternfly/react-core'; import { GRAPH_POSITION_CHANGE_EVENT, @@ -34,12 +34,13 @@ interface TopologyViewComponentProps { sideBarResizable?: boolean; } -const TopologyViewComponent: React.FunctionComponent = observer( +const TopologyViewComponent: FunctionComponent = observer( ({ useSidebar, sideBarResizable = false }) => { const [selectedIds, setSelectedIds] = useState([]); const [showAreaDragHint, setShowAreaDragHint] = useState(false); const controller = useVisualizationController(); const options = useContext(DemoContext); + const hasGraph = controller.hasGraph(); useEffect(() => { const dataModel = generateDataModel( @@ -61,6 +62,14 @@ const TopologyViewComponent: React.FunctionComponent controller.fromModel(model, true); }, [controller, options.creationCounts, options.layout]); + // Once we have the graph, run the layout. This ensures the graph size is set (by the initial size observation in VisualizationSurface) + // and the graph is centered by the layout. + useEffect(() => { + if (hasGraph) { + controller.getGraph().layout(); + } + }, [hasGraph, controller]); + useEventListener(SELECTION_EVENT, (ids) => { setSelectedIds(ids); }); @@ -149,7 +158,7 @@ const TopologyViewComponent: React.FunctionComponent } ); -export const Topology: React.FC<{ useSidebar?: boolean; sideBarResizable?: boolean }> = ({ +export const Topology: FunctionComponent<{ useSidebar?: boolean; sideBarResizable?: boolean }> = ({ useSidebar = false, sideBarResizable = false }) => { @@ -165,10 +174,10 @@ export const Topology: React.FC<{ useSidebar?: boolean; sideBarResizable?: boole ); }; -export const TopologyPackage: React.FunctionComponent = () => { +export const TopologyPackage: FunctionComponent = () => { const [activeKey, setActiveKey] = useState(0); - const handleTabClick = (_event: React.MouseEvent, tabIndex: string | number) => { + const handleTabClick = (_event: ReactMouseEvent, tabIndex: string | number) => { setActiveKey(tabIndex); }; diff --git a/packages/demo-app-ts/src/index.tsx b/packages/demo-app-ts/src/index.tsx index 786aa7a9..8ae1d228 100755 --- a/packages/demo-app-ts/src/index.tsx +++ b/packages/demo-app-ts/src/index.tsx @@ -1,7 +1,5 @@ import { createRoot } from 'react-dom/client'; import '@patternfly/react-core/dist/styles/base.css'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import React from 'react'; import './index.css'; import App from './App';