Internal utilities for Nx graph visualization, not intended for external use.
@nx/graph/legacyThis entry point is mainly for migration purposes. This contains the entire old @nx/graph library.
@nx/graphCore of Nx Graph that contains base styles, basic types, and logic to render Cytoscape elements.
A custom hook that allows consumers to listen for various events on the RenderGraph: the nodes, the edges, the background click
``tsx
const { graphClient, send } = useProjectGraphClient({
/.../
});
useRenderGraphEvent(graphClient, 'CompositeNodeDblClick', (event) => {
if (event.isExpanded) {
send({ type: 'collapseCompositeNode', compositeNodeId: event.id });
} else {
send({
type: 'expandCompositeNode',
compositeNodeId: event.id,
mode: 'affected-only',
});
}
});
`
#### Events
`ts
export interface CompositeProjectNodeDblClickEvent {
type: 'CompositeNodeDblClick';
id: string;
isExpanded: boolean;
}
export interface ProjectNodeContextMenuEvent {
type: 'ProjectNodeContextMenu';
id: string;
data: ProjectNodeElementData;
virtualElement: VirtualElement;
}
export interface CompositeProjectNodeContextMenuEvent {
type: 'CompositeNodeContextMenu';
id: string;
isExpanded: boolean;
data: CompositeProjectNodeElementData;
virtualElement: VirtualElement;
}
export interface ProjectEdgeContextMenuEvent {
type: 'ProjectEdgeContextMenu';
id: string;
data: ProjectEdgeElementData;
virtualElement: VirtualElement;
}
export interface CompositeProjectEdgeContextMenuEvent {
type: 'CompositeProjectEdgeContextMenu';
id: string;
data: CompositeProjectEdgeElementData;
virtualElement: VirtualElement;
}
export interface EmptyClickEvent {
type: 'EmptyClick';
}
export interface PostRenderEvent {
type: 'PostRender';
cy: Core;
}
export type RenderGraphEvent = CompositeProjectNodeDblClickEvent | ProjectNodeContextMenuEvent | CompositeProjectNodeContextMenuEvent | ProjectEdgeContextMenuEvent | CompositeProjectEdgeContextMenuEvent | EmptyClickEvent | PostRenderEvent;
`
This entry point deals with handling ProjectGraph information.
`tsx`
const { containerRef, graphClient, send } = useProjectGraphClient({ renderPlatform: 'nx-cloud' });
- containerRef is used to assign to a div element where the graph will be rendered.graphClient
- can be used with other graph components like useRenderGraphEventsend
- is a function that can send events that the ProjectGraphClient handles
This entry point deals with handling TaskGraph information.
`tsx`
const { containerRef, graphClient, send } = useTaskGraphClient({ renderPlatform: 'nx-cloud' });
- containerRef is used to assign to a div element where the graph will be rendered.graphClient
- can be used with other graph components like useRenderGraphEventsend
- is a function that can send events that the TaskGraphClient handles
This entry point contains various graph UI components
A static background component.
` tsx`
A container that holds the graph controls; usually in form of icons
` tsx`
A collapsible element that renders graph legends
`tsx`
{{
nodes: (
<>
{touchedProjects.length > 0 &&
>
),
edges: (
<>
>
),
}}
#### Pre-build legends
- NodeLegend: legend for a regular nodeCompositeNodeLegend
- : legend for a composite nodeAffectedNodeLegend
- : legend for a node whose isAffected is trueTouchedNodeLegend
- : legend for a node whose isTouched is trueEdgeLegend
- : legend for a regular edgeCompositeEdgeLegend
- : legend for a composite edge
All legends can be customized: colors, labels, etc...
Handles context menu of the elements on the graph.
To enable context menu, useGraphContextMenu hook is required. This hook sets up listeners for various render events and return proper graphMenu object
`tsx`
const { graphMenu, closeMenu } = useGraphContextMenu({
/ require graphClient or any RenderGraphEventBus /
renderGraphEventBus: graphClient,
});
graphMenu object is used to render NxGraphContextMenu
`tsx`
{
graphMenu ? (
{/ {children goes here} /}
) : null;
}
NxGraphContextMenu only handles the floating menu. To render the content, NxGraphContextMenu accepts a dictionary of children render props
`ts`
{
project: ({ id: string, data: ProjectNodeElementData }) => ReactNode;
compositeProject: ({ id: string, isExpanded: boolean, data: CompositeProjectNodeElementData }) => ReactNode;
}
Each children render prop can render multiple NxGraphContextMenuSection
`tsx`
{{
project: ({ id, data }) => (
<>
>
),
}}
> ViewDetailButton and ExcludeNodeButton are implementation details. They can be anything that the consumers want to render in the Project Node's context menu.
Handles panels in the graph.
To render a panel, capture a NodeElementData (via NxGraphContextMenu or useRenderGraphEvent) then use NxGraphElementDetailPanel
`tsx``
{{
project: (projectNodeElementData) => <>{/ any content /}>,
compositeProject: (compositeProjectNodeElementData) => <>{/ any content /}>,
}}