Skip to content

Commit 63b2be0

Browse files
Bottom node selection menu and some refactoring, re-styling
1 parent 7c6de0a commit 63b2be0

File tree

13 files changed

+179
-14
lines changed

13 files changed

+179
-14
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "iknow-entity-browser",
3-
"version": "0.0.5",
3+
"version": "0.0.6",
44
"description": "Visualizer for iKnow entities",
55
"main": "gulpfile.babel.js",
66
"scripts": {

src/static/index.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ <h1>Selected Nodes</h1>
3636
</div>
3737
</div>
3838
</div>
39+
<div id="nodeDetails">
40+
<div class="header">
41+
<div class="icons">
42+
<i id="nodeDetailsToggle" class="icon-th-list disabled"></i>
43+
</div>
44+
<div class="text">Please, select a node.</div>
45+
</div>
46+
<div class="content">
47+
<h1>WELCOME</h1>
48+
<h3>THIS IS A GAME</h3>
49+
<h5>TEST GAME!</h5>
50+
</div>
51+
</div>
3952
</div>
4053
</body>
4154
</html>

src/static/js/details/index.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import * as model from "../model";
2+
import { onSelectionUpdate } from "../selection";
3+
4+
let selectedNode = null;
5+
6+
onSelectionUpdate((selection) => {
7+
8+
d3.select("#nodeDetailsToggle").classed("disabled", selection.length !== 1);
9+
selectedNode = selection.length === 1 ? selection[0] : null;
10+
updateHeader();
11+
12+
});
13+
14+
function updateHeader () {
15+
16+
d3.select("#nodeDetails .header .text").text(
17+
selectedNode
18+
? `Node "${ selectedNode.label }" (${ selectedNode.type }) selected.`
19+
: "Please, select one node."
20+
);
21+
22+
if (!selectedNode) {
23+
d3.select("#nodeDetails").classed("active", model.uiState.detailsToggled = false);
24+
}
25+
26+
}
27+
28+
export function init () {
29+
30+
d3.select("#nodeDetailsToggle")
31+
.data([model.uiState])
32+
.on("click", function (d) {
33+
if (!selectedNode)
34+
return;
35+
d.detailsToggled = !d.detailsToggled;
36+
d3.select("#nodeDetails").classed("active", d.detailsToggled);
37+
});
38+
39+
updateHeader();
40+
41+
}

src/static/js/graph/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { updateSelectedNodes } from "../tabular";
22
import { getGraphData } from "../model";
3+
import { updateSelection } from "../selection";
34

45
export function update () {
56

@@ -75,7 +76,7 @@ export function update () {
7576
node.classed("selected", (p) => p.selected = p.previouslySelected = false)
7677
}
7778
d3.select(this).classed("selected", d.selected = !d.selected); // (!prevSel)
78-
updateSelectedNodes();
79+
updateSelection();
7980
});
8081

8182
var circle = node.append("circle")
@@ -116,7 +117,7 @@ export function update () {
116117
if (!d3.event.sourceEvent) return;
117118
setTimeout(() => {
118119
brush.call(brusher.move, null);
119-
updateSelectedNodes();
120+
updateSelection();
120121
}, 25);
121122
});
122123

src/static/js/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { update } from "./graph";
22
import * as tabular from "./tabular";
3+
import * as details from "./details";
34

45
window.init = () => {
56

67
update();
78
tabular.init();
9+
details.init();
810

911
};

src/static/js/model/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ export function getGraphData () {
1212
}
1313

1414
export var uiState = {
15-
tableToggled: false
15+
tabularToggled: false,
16+
detailsToggled: false
1617
};

src/static/js/selection.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import * as model from "./model";
2+
3+
let selection = [],
4+
callbacks = [];
5+
6+
export function updateSelection () {
7+
8+
selection = model.getGraphData().nodes.filter(node => !!node.selected);
9+
10+
callbacks.forEach(c => c(selection));
11+
12+
}
13+
14+
/**
15+
* The callback is invoked when selection changes.
16+
* @param {selectionCallback} callback
17+
*/
18+
export function onSelectionUpdate (callback) {
19+
20+
callbacks.push(callback);
21+
22+
}
23+
24+
/**
25+
* This callback is invoked when selection changes.
26+
* @callback selectionCallback
27+
* @param {*[]} nodes - Currently selected nodes.
28+
*/

src/static/js/tabular/index.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { csv } from "./export";
22
import * as model from "../model";
3+
import { onSelectionUpdate, updateSelection } from "../selection";
34

45
var graph;
56

6-
export function updateSelectedNodes () {
7-
if (!model.uiState.tableToggled)
7+
onSelectionUpdate((selection) => {
8+
if (!model.uiState.tabularToggled)
89
return;
9-
let data = graph.nodes.filter(node => !!node.selected).sort((a, b) =>
10+
let data = selection.sort((a, b) =>
1011
a.entities[0].score > b.entities[0].score ? -1 : 1
1112
),
1213
table = document.querySelector("#table table tbody");
@@ -20,7 +21,7 @@ export function updateSelectedNodes () {
2021
row.insertCell(3).textContent = node.entities[0].frequency;
2122
row.insertCell(4).textContent = node.entities[0].spread;
2223
}
23-
}
24+
});
2425

2526
export function init () {
2627

@@ -29,10 +30,10 @@ export function init () {
2930
d3.select("#tableToggle")
3031
.data([model.uiState])
3132
.on("click", function (d) {
32-
d.tableToggled = !d.tableToggled;
33-
d3.select(this).classed("toggled", d.tableToggled);
34-
d3.select("#table").classed("active", d.tableToggled);
35-
updateSelectedNodes();
33+
d.tabularToggled = !d.tabularToggled;
34+
d3.select(this).classed("toggled", d.tabularToggled);
35+
d3.select("#table").classed("active", d.tabularToggled);
36+
updateSelection();
3637
});
3738

3839
d3.select("#exportCSV").on("click", () => {

src/static/scss/const.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
$defaultTransition: all .3s ease;
22
$defaultPadding: 10px;
3-
$defaultShadow: 0 1px 2px gray;
3+
$defaultShadow: 0 0 2px gray;
44

55
$colorA: #02ad8b;

src/static/scss/icons-all.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
color: $colorA;
1212
&:hover { color: black; }
1313
}
14+
&.disabled {
15+
color: gray;
16+
&:hover { color: gray; }
17+
}
1418
}
1519

1620
.uiIconGroup {

0 commit comments

Comments
 (0)