Remarks
This class can be used when the data consists of one or more collections of nodes, each of which knows its neighbors, and optionally, groups. The methods createNodesSource, createGroupNodesSource, createSuccessorsSource, createPredecessorsSource, createOutEdgesSource, and createInEdgesSource create new source collections from which nodes and group nodes will be created.
Generally, using the AdjacencyGraphBuilder class consists of a few basic steps:
- Create an AdjacencyGraphBuilder and optionally, provide an IGraph on which it should operate.
const adjacencyBuilder = new AdjacencyGraphBuilder(graph) - Create one or more nodes sources from which the AdjacencyGraphBuilder creates the initial nodes in the graph. By adding group node sources, group nodes are created.
const orangeData = getAdjacencyNodesData() // create source for initial nodes (orange nodes) const orangeNodesSource = adjacencyBuilder.createNodesSource( orangeData, // nodes data (orangeDataItem) => orangeDataItem.nodeId, // node id provider ) - To create neighbor nodes and edges to or from them, create new successor sources or predecessor sources as neighbor sources of the initial sources.
By adding existing successor sources or predecessor sources , edges can be defined between existing sources.
// create an EdgeCreator for edges adjacent to orange nodes const orangeEdgeCreator = new EdgeCreator<OrangeData>() // create a nodes source for the green nodes as successor of orangeNodesSource const greenNodesSource = orangeNodesSource.createSuccessorsSource( (orangeNodeDataItem) => orangeNodeDataItem.successorNodes, orangeEdgeCreator, ) // add the same source also as predecessor orangeNodesSource.addPredecessorsSource( (orangeNodeDataItem) => orangeNodeDataItem.predecessorNodes, greenNodesSource, orangeEdgeCreator, )By adding existing successor ids or predecessor ids, edges can be defined between the nodes of existing sources where the neighbors are defined by their id.
const greenEdgeCreator = new EdgeCreator<GreenData>() // register EdgeCreator for edges to orange successor nodes created by orangeNodesSource greenNodesSource.addSuccessorIds( (greenNodeDataItem) => greenNodeDataItem.successorNodeIds, greenEdgeCreator, ) // register EdgeCreator for edges to orange predecessor nodes created by orangeNodesSource greenNodesSource.addPredecessorIds( (greenNodeDataItem) => greenNodeDataItem.predecessorNodeIds, greenEdgeCreator, )Using the methods mentioned above, edges are always created implicitly between the nodes of an AdjacencyNodesSource<TDataItem> and their added neighbors providing the data items of the nodes to the EdgeCreator<TDataItem>.
When the data items of an AdjacencyNodesSource<TDataItem> do not know their neighbor items directly but know their outgoing and incoming edges which in turn know the data items of the opposite nodes, the corresponding methods createOutEdgesSource, createInEdgesSource, addOutEdgesSource, addInEdgesSource, addOutEdgesSourceToId, and addInEdgesSourceToId can be used that provide the specified edge data items to the EdgeCreator<TDataItem>.
// create and register EdgeCreator for purple edges const purpleEdgeCreator = new EdgeCreator<PurpleEdgeData>() orangeNodesSource.addOutEdgesSource<PurpleEdgeData, GreenData>( (nodeDataItem) => nodeDataItem.purpleOutEdges, (purpleEdgeDataItem) => purpleEdgeDataItem.greenTargetNode, greenNodesSource, // use existing nodesSource for target nodes purpleEdgeCreator, ) // create and register EdgeCreator for yellow edges orangeNodesSource.addOutEdgesSourceToId<YellowEdgeData>( (orangeNodeDataItem) => orangeNodeDataItem.yellowOutEdges, (yellowEdgeDataItem) => yellowEdgeDataItem.targetNodeId, new EdgeCreator(), ) - Each AdjacencyNodesSource<TDataItem> provides a NodeCreator<TDataItem> that allows for further specification of how the items from this source should be created. You can provide defaults for the default styling but also bind more specific styling based on the actual data item with the styleProvider and styleBindings.
orangeNodesSource.nodeCreator.defaults.shareStyleInstance = false orangeNodesSource.nodeCreator.defaults.style = new ShapeNodeStyle({ stroke: 'darkRed', fill: 'orange', }) // nodes without successor should have a diamond shape orangeNodesSource.nodeCreator.styleBindings.addBinding( 'shape', (redDataItem) => redDataItem.successorNodes.length > 0 ? 'roundRectangle' : 'diamond', )It also allows for obtaining layout information from the data item ( layoutProvider), as well as further specification of the created node's tag ( tagProvider).
- The edge creation can be adjusted by passing suitable EdgeCreator<TDataItem> instances when adding a neighbor source. It allows to specify the styling of the created edges (defaults, styleProvider, styleBindings).
greenEdgeCreator.defaults.style = new PolylineEdgeStyle({ stroke: 'forestGreen', })Furthermore, it allows for obtaining bend locations from the data item ( bendsProvider), as well as further specification of the created edge's tag ( tagProvider).
greenEdgeCreator.bendsProvider = (edgeDataItem) => edgeDataItem.bendPoints - Optionally, labels can be added by providing one or multiple label bindings. If there is a varying number of labels per node, createLabelsSource can be used, instead. Similar methods are also available on the EdgeCreator<TDataItem>.
The LabelsSource<TDataItem> provides a LabelCreator<TDataItem> that allows for adjusting all aspects of the label creation, like style, text, size, and tag.
const edgeLabelCreator = purpleEdgeCreator.createLabelBinding( (purpleEdgeData) => purpleEdgeData.connectionType, ) edgeLabelCreator.defaults.style = new LabelStyle({ backgroundFill: 'white', backgroundStroke: 'purple', textSize: 8, }) - Call buildGraph to populate the graph. You can apply a layout algorithm afterward to make the graph look nice.
// Build a graph initially adjacencyBuilder.buildGraph() // Apply a layout in a subsequent step graph.applyLayout(new HierarchicalLayout()) - If your items or collections change later, call updateGraph to make the changes visible in the graph. If the data item instances have changed, you can call setData.
// Set the new data collections: adjacencyBuilder.setData(orangeNodesSource, getAdjacencyNodesData()) // Update a graph after the business data has changed adjacencyBuilder.updateGraph() // Apply a layout in a subsequent step graph.applyLayout(new HierarchicalLayout())
You can further customize how nodes, groups, and edges are created by adding event handlers to the various events and modifying the items there. This can be used to modify items in ways that are not directly supported by the available bindings or defaults. There are creation and update events for all items, which allow for separate customization when nodes, groups, and edges are created or updated. For completely static graphs, where updateGraph is not needed, the update events can be safely ignored.
See Also
- The different graph builders are discussed in the section Creating a Graph from Business Data. Class
AdjacencyGraphBuilder, in particular, is topic of section AdjacencyGraphBuilder. Developer's Guide
API
- GraphBuilder, TreeBuilder
Members
Constructors
Initializes a new instance of the AdjacencyGraphBuilder class that operates on the given graph.
Properties
Methods
Binds a collection of data items to the given nodesSource.
nodesSource.Parameters
- data: any
- The collection of objects that is bound to the source.
- nodesSource: AdjacencyNodesSource<TDataItem>
- The source to which the data is bound.
Populates the graph with items generated from the bound data.
Return Value
See Also
API
- updateGraph
createGroupNodesSource
<TDataItem> (data: any, idProvider: function(TDataItem, any): any): AdjacencyNodesSource<TDataItem>Creates a new AdjacencyNodesSource<TDataItem> and binds a collection of group node data items to it.
createGroupNodesSource
<TDataItem> (data: any, idProvider: function(TDataItem, any): any): AdjacencyNodesSource<TDataItem>The NodeCreator<TDataItem> of the returned AdjacencyNodesSource<TDataItem> can be used to further specify creation properties of these items, e.g. style, layout, etc.
Data items of this collection are created as group nodes in the graph.
Parameters
- data: any
- The collection of objects to iterate and create the group nodes from.
- idProvider: function(TDataItem, any): any
- An optional function that yields an ID for each element in the
data. This ID is used by parentIdProvider, addSuccessorIds, and addPredecessorIds to resolve the parent, source, or target nodes. The ID is also used to identify nodes during updateGraph.
Return Value
- AdjacencyNodesSource<TDataItem>
- A new AdjacencyNodesSource<TDataItem> instance that can be used to further customize the creation of nodes, e.g. provide specific style defaults.
createNodesSource
<TDataItem> (data: any, idProvider: function(TDataItem, any): any): AdjacencyNodesSource<TDataItem>Creates a new AdjacencyNodesSource<TDataItem> and binds a collection of node data items to it.
createNodesSource
<TDataItem> (data: any, idProvider: function(TDataItem, any): any): AdjacencyNodesSource<TDataItem>Parameters
- data: any
- The collection of objects to iterate and create the nodes from.
- idProvider: function(TDataItem, any): any
- An optional function that yields an ID for each element in the
data. This ID is used by parentIdProvider, addSuccessorIds, and addPredecessorIds to resolve the parent, source, or target nodes. The ID is also used to identify nodes during updateGraph.
Return Value
- AdjacencyNodesSource<TDataItem>
- A new AdjacencyNodesSource<TDataItem> instance that can be used to further customize the creation of nodes, e.g. provide specific style defaults.
Returns the data item the given node was created for.
node was created for.Parameters
- node: INode
- The node that was created for the data item.
Return Value
- any
- The data item the given
nodewas created for.
Returns the data item the given edge was created for.
edge was created for.The returned data item was processed by one of the added AdjacencyNodesSource<TDataItem>.
For edges created via createSuccessorsSource or createPredecessorsSource the data item is the same as the one used for the node the successors or predecessors were created for.
For edges created via createInEdgesSource or createOutEdgesSource the data item is the one provided by the edge data provider of these methods.
Parameters
- edge: IEdge
- The edge that was created for the data item.
Return Value
- any
- The data item the given
edgewas created for.
id for the data item was provided by the idProvider of one of the added AdjacencyNodesSource<TDataItem>.Parameters
- id: TId
- The id the node was created for.
Return Value
Parameters
- item: TDataItem
- The data item the node was created for.
Return Value
Triggers the edge-created event.
Parameters
- edge: IEdge
- The edge that has been created.
- dataItem: any
- The data item from which the edge has been created.
Triggers the edge-removed event.
Parameters
- edge: IEdge
- The edge that has been removed.
- dataItem: any
- The corresponding data item of the removed edge.
Triggers the edge-updated event.
Parameters
- edge: IEdge
- The edge that has been updated.
- dataItem: any
- The data item with which the edge has been updated.
Triggers the label-added event.
Parameters
- label: ILabel
- The label that has been added.
- dataItem: any
- The data item from which the label has been created.
Triggers the label-removed event.
Parameters
- label: ILabel
- The label that has been removed.
- dataItem: any
- The corresponding data item of the removed label.
Triggers the label-updated event.
Parameters
- label: ILabel
- The label that has been updated.
- dataItem: any
- The data item with which the label has been updated.
Triggers the node-created event.
Parameters
- node: INode
- The node that has been created.
- dataItem: any
- The data item from which the node has been created.
Triggers the node-removed event.
Parameters
- node: INode
- The node that has been removed.
- dataItem: any
- The corresponding data item of the removed node.
Triggers the node-updated event.
Parameters
- node: INode
- The node that has been updated.
- dataItem: any
- The data item with which the node has been updated.
Binds a new data collection to an AdjacencyNodesSource<TDataItem>, replacing the old one.
nodesSource, such that updateGraph considers the new collection.Parameters
- nodesSource: AdjacencyNodesSource<TDataItem>
- The source whose data source should be reassigned.
- data: any
- The collection of objects that is specified for the given source.
update methods on the creators (e.g. updateStyle), resolves the provider (e.g. styleProvider) and applies the bindings (e.g. applyStyleBindings). The latter can also be applied solely.For example, to update any aspect of node creation:
// configure the NodeCreator to update non-structural aspects
nodesSource.nodeCreator.addEventListener('node-updated', (evt) => {
nodesSource.nodeCreator.updateLayout(evt.graph, evt.item, evt.dataItem)
nodesSource.nodeCreator.updateStyle(evt.graph, evt.item, evt.dataItem)
nodesSource.nodeCreator.updateTag(evt.graph, evt.item, evt.dataItem)
nodesSource.nodeCreator.updateLabels(evt.graph, evt.item, evt.dataItem)
})
builder.updateGraph()Events
Occurs when an edge has been created by any one of AdjacencyNodesSource<TDataItem>'s add or create methods.
This event can be used to further customize the created edge.
New edges are created either in response to calling buildGraph, or in response to calling updateGraph when there are new items in the edges sources.
Properties of
GraphBuilderItemEventArgs<IEdge, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when an edge has been removed.
This event can be used to further handle the removal of the removed edge.
Edges are removed in response to calling updateGraph.
Properties of
GraphBuilderItemEventArgs<IEdge, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when an edge has been updated.
This event can be used to further customize the updated edge.
Edges are updated in response to calling updateGraph.
Properties of
GraphBuilderItemEventArgs<IEdge, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when a label has been added to a node or edge.
This event can be used to further customize the created label.
New labels are added in response to calling buildGraph, or in response to calling updateGraph.
Properties of
GraphBuilderItemEventArgs<ILabel, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when a node or edge label has been removed.
This event can be used to further handle the removal of the removed label.
Labels are removed in response to calling updateGraph.
Properties of
GraphBuilderItemEventArgs<ILabel, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when a node or edge label has been updated.
This event can be used to further customize the updated label.
Labels are updated in response to calling updateGraph.
Properties of
GraphBuilderItemEventArgs<ILabel, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when a node has been created by any one of the nodes sources.
This event can be used to further customize the created node.
New nodes are created either in response to calling buildGraph, or in response to calling updateGraph when there are new items in the nodes sources.
Properties of
GraphBuilderItemEventArgs<INode, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when a node has been removed from any one of the nodes sources.
This event can be used to further handle the removal of the removed node.
Nodes are removed in response to calling updateGraph.
Properties of
GraphBuilderItemEventArgs<INode, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.
See Also
Occurs when a node has been updated.
This event can be used to further customize the updated node.
Nodes are updated in response to calling updateGraph.
Properties of
GraphBuilderItemEventArgs<INode, any>- dataItem: TDataItem
- Gets the object the item has been created from.
- item: TItem
- Gets the item that is the subject of the event.