Skip to content
  1. Examples

Group selection

This example shows how to use nodeGrouping to group selected nodes.

ts
import Ogma, { NodeGrouping } from '@linkurious/ogma';

const ogma = new Ogma({
  container: 'graph-container'
});

const duration = 300;

const graph = await ogma.generate.random({ nodes: 15, edges: 15 });
await ogma.setGraph(graph);
await ogma.view.locateGraph();
await ogma.getNodes().slice(5, 10).setSelected(true);

const transformations: NodeGrouping<any, any>[] = [];

document.getElementById('group-button')!.addEventListener('click', () => {
  const selectedNodes = ogma.getSelectedNodes();

  if (selectedNodes.size < 2) return;

  const grouping = ogma.transformations.addNodeGrouping({
    selector: node => selectedNodes.includes(node),
    nodeGenerator: nodes => ({
      attributes: {
        radius: nodes.reduce((radius, node) => {
          return radius + node.getAttribute('radius');
        }, 0)
      }
    }),
    duration
  });

  transformations.push(grouping);
});

document.getElementById('ungroup-button')!.addEventListener('click', () => {
  if (transformations.length > 0) transformations.pop()!.destroy(duration);
});
html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />

    <link type="text/css" rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <div id="graph-container"></div>
    <button id="group-button" class="group">Group selected nodes</button>
    <button id="ungroup-button" class="ungroup">Undo last grouping</button>
    <script type="module" src="index.ts"></script>
  </body>
</html>
css
#graph-container {
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  position: absolute;
  margin: 0;
  overflow: hidden;
}
button {
  padding: 5px;
}
.group {
  position: absolute;
  top: 2em;
  right: 2em;
}
.ungroup {
  position: absolute;
  top: 5em;
  right: 2em;
}