Appearance
Node collapsing
This example shows how to use the nodeCollapsing transformation to collapse nodes in a graph.
ts
import Ogma, { NodeCollapsing } from '@linkurious/ogma';
interface NodeData {
type: 'person' | 'company' | 'building';
name: string;
}
interface EdgeData {
type: 'employee_of' | 'works_at' | 'located_at';
}
const ogma = new Ogma<NodeData, EdgeData>({
container: 'graph-container',
options: {
backgroundColor: '#f6f6f6'
},
graph: {
nodes: [
{
id: 0,
data: { type: 'person', name: 'John Smith' },
attributes: { x: 0, y: 0 }
},
{
id: 1,
data: { type: 'company', name: 'Proton Brews' },
attributes: { x: 30, y: -20 }
},
{
id: 2,
data: { type: 'building', name: '211 Golden Star Rd' },
attributes: { x: 60, y: 0 }
}
],
edges: [
{ id: 0, source: 0, target: 1, data: { type: 'employee_of' } },
{ id: 1, source: 1, target: 2, data: { type: 'located_at' } }
]
}
});
const ICONS = {
person: '\uf007',
company: '\uf155',
building: '\uf1ad'
};
const COLORS = {
person: 'orange',
company: 'dodgerblue',
building: 'green'
};
ogma.styles.addRule({
nodeAttributes: {
color: node => COLORS[node.getData('type')],
text: node => node.getData('name'),
icon: {
content: node => ICONS[node.getData('type')],
font: 'Font Awesome 5 Free'
}
},
edgeAttributes: {
shape: 'arrow',
text: edge => edge.getData('type')
}
});
const button = document.getElementById('btn') as HTMLButtonElement;
let transformation: NodeCollapsing<NodeData, EdgeData> | null = null;
const enableButton = () => {
button.disabled = false;
button.textContent = button.textContent === 'Collapse' ? 'Undo' : 'Collapse';
};
document.getElementById('btn')!.addEventListener('click', () => {
if (transformation) {
transformation.destroy(500).then(enableButton);
button.disabled = true;
transformation = null;
} else {
transformation = ogma.transformations.addNodeCollapsing({
selector: node => node.getData('type') === 'company',
edgeGenerator: hiddenNode => {
console.log('generating edge from node', hiddenNode.getId());
return { data: { type: 'works_at' } };
},
duration: 500
});
button.disabled = true;
transformation.whenApplied().then(enableButton);
}
});
html
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<link
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/solid.min.css"
rel="stylesheet"
/>
<link type="text/css" rel="stylesheet" href="styles.css" />
</head>
<body>
<div id="graph-container"></div>
<div class="panel">
<button id="btn">Collapse</button>
</div>
<script type="module" src="index.ts"></script>
</body>
</html>
css
html,
body {
font-family: 'Inter', sans-serif;
}
:root {
--base-color: #4999f7;
--active-color: var(--base-color);
--gray: #d9d9d9;
--white: #ffffff;
--lighter-gray: #f4f4f4;
--light-gray: #e6e6e6;
--inactive-color: #cee5ff;
--group-color: #525fe1;
--group-inactive-color: #c2c8ff;
--selection-color: #04ddcb;
--darker-gray: #b6b6b6;
--dark-gray: #555;
--dark-color: #3a3535;
--edge-color: var(--dark-color);
--border-radius: 5px;
--button-border-radius: var(--border-radius);
--edge-inactive-color: var(--light-gray);
--button-background-color: #ffffff;
--shadow-color: rgba(0, 0, 0, 0.25);
--shadow-hover-color: rgba(0, 0, 0, 0.5);
--button-shadow: 0 0 4px var(--shadow-color);
--button-shadow-hover: 0 0 4px var(--shadow-hover-color);
--button-icon-color: #000000;
--button-icon-hover-color: var(--active-color);
}
#graph-container {
top: 0;
bottom: 0;
left: 0;
right: 0;
position: absolute;
margin: 0;
overflow: hidden;
}
.ui {
position: absolute;
display: flex;
flex-direction: column;
gap: 0.5em;
}
#custom-group-btn {
top: 40px;
}
.panel {
background: var(--button-background-color);
border-radius: var(--button-border-radius);
box-shadow: var(--button-shadow);
padding: 10px;
}
.panel {
position: absolute;
top: 20px;
left: 20px;
}
.panel h2 {
text-transform: uppercase;
font-weight: 400;
font-size: 14px;
margin: 0;
}
.panel {
margin-top: 1px;
padding: 5px 10px;
text-align: center;
}
.panel button {
background: var(--button-background-color);
border: none;
border-radius: var(--button-border-radius);
border-color: var(--shadow-color);
padding: 5px 10px;
cursor: pointer;
width: 100%;
color: var(--dark-gray);
border: 1px solid var(--light-gray);
}
.panel button:hover {
background: var(--lighter-gray);
border: 1px solid var(--darker-gray);
}
.panel button[disabled] {
color: var(--light-gray);
border: 1px solid var(--light-gray);
background-color: var(--lighter-gray);
}