Skip to content

Commit 35cc3da

Browse files
authored
Merge pull request #39 from alphagov/ACW-64/Drilldown-on-nodes
Ability to visualise value of Node in tabular view
2 parents f87c7b3 + 1dfe7bb commit 35cc3da

2 files changed

Lines changed: 35 additions & 5 deletions

File tree

templates/graph.html

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
</div>
1717
</div>
1818
<aside class="sidebar govuk-body">
19+
<button id="list-view-btn" class="govuk-button govuk-button--secondary" style="margin-bottom: 20px;">Show in list view</button>
1920
<h2 id="sidebar-title">No node selected</h2>
2021
<div id="node-details"><p>Select a node to view details.</p></div>
2122
</aside>
@@ -27,6 +28,29 @@ <h2 id="sidebar-title">No node selected</h2>
2728
const sidebarTitle = document.getElementById('sidebar-title');
2829
const details = document.getElementById('node-details');
2930
const filterInput = document.getElementById('graph-filter-input');
31+
const listViewBtn = document.getElementById('list-view-btn');
32+
33+
let selectedNodeData = null;
34+
35+
listViewBtn.addEventListener('click', () => {
36+
let url = `/metrics?run_path={{ run_path }}`;
37+
if (selectedNodeData) {
38+
const data = selectedNodeData.data();
39+
const query = data.label;
40+
url += `&q=${encodeURIComponent(query)}`;
41+
42+
if (data.type === 'entity') {
43+
url += `&entity_id=${encodeURIComponent(data.id)}`;
44+
} else if (data.type === 'alias') {
45+
url += `&alias_id=${encodeURIComponent(data.id)}`;
46+
const parentEntities = selectedNodeData.incomers('node[type="entity"]');
47+
if (parentEntities.length > 0) {
48+
url += `&entity_id=${encodeURIComponent(parentEntities[0].id())}`;
49+
}
50+
}
51+
}
52+
window.location.href = url;
53+
});
3054

3155
const BASE_NODE_SIZE = 10;
3256

@@ -70,8 +94,7 @@ <h2 id="sidebar-title">No node selected</h2>
7094
function renderEntityDetails(node) {
7195
const data = node.data();
7296

73-
const aliasEdges = node.connectedEdges('edge[edge_type="alias"]');
74-
const aliasNodes = aliasEdges.connectedNodes('node[type="alias"]');
97+
const aliasNodes = node.outgoers('node[type="alias"]');
7598
const aliasCount = aliasNodes.length;
7699

77100
sidebarTitle.textContent =
@@ -144,7 +167,7 @@ <h2 id="sidebar-title">No node selected</h2>
144167

145168
function calculateEntityNodeSize(node) {
146169
const data = node.data();
147-
const aliasCount = node.connectedEdges('edge[edge_type="alias"]').length;
170+
const aliasCount = node.outgoers('node[type="alias"]').length;
148171
return BASE_NODE_SIZE + aliasCount * 2;
149172
}
150173

@@ -155,6 +178,7 @@ <h2 id="sidebar-title">No node selected</h2>
155178
}
156179

157180
function resetSidebar() {
181+
selectedNodeData = null;
158182
sidebarTitle.textContent = 'No node selected';
159183
details.innerHTML = '<p>Select a node to view details.</p>';
160184
}
@@ -280,6 +304,7 @@ <h2 id="sidebar-title">No node selected</h2>
280304
});
281305

282306
cy.on('select', 'node', (event) => {
307+
selectedNodeData = event.target;
283308
renderNodeDetails(event.target);
284309
});
285310

templates/metrics.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
const urlParams = new URLSearchParams(window.location.search);
2424
const initialFilters = urlParams.getAll('q');
2525

26+
const initialEntityId = urlParams.get('entity_id');
27+
const initialAliasId = urlParams.get('alias_id');
28+
2629
const [entities, setEntities] = useState([]);
2730
const [loading, setLoading] = useState(true);
2831
const [error, setError] = useState(null);
@@ -32,8 +35,8 @@
3235

3336
const [currentPage, setCurrentPage] = useState(1);
3437
const [pageSize, setPageSize] = useState(10);
35-
const [selectedEntityId, setSelectedEntityId] = useState(null);
36-
const [selectedAliasId, setSelectedAliasId] = useState(null);
38+
const [selectedEntityId, setSelectedEntityId] = useState(initialEntityId || null);
39+
const [selectedAliasId, setSelectedAliasId] = useState(initialAliasId || null);
3740
const [checkedEntityIds, setCheckedEntityIds] = useState(new Set());
3841
const [sortConfig, setSortConfig] = useState({ key: 'entity', direction: 'asc' });
3942

@@ -104,6 +107,8 @@
104107
}, []);
105108

106109
useEffect(() => {
110+
if (entities.length === 0) return;
111+
107112
if (selectedEntityId) {
108113
const entity = entities.find(e => e.data.id === selectedEntityId);
109114
if (entity && entity.aliases.length > 0) {

0 commit comments

Comments
 (0)