|
@ -0,0 +1,113 @@ |
|
|
|
|
|
<html> |
|
|
|
|
|
|
|
|
|
|
|
<head> |
|
|
|
|
|
<title>Timeline | A lot of grouped data</title> |
|
|
|
|
|
|
|
|
|
|
|
<script src="../../../docs/js/jquery.min.js"></script> |
|
|
|
|
|
<script src="../../../dist/vis.js"></script> |
|
|
|
|
|
<link href="../../../dist/vis-timeline-graph2d.min.css" rel="stylesheet" type="text/css" /> |
|
|
|
|
|
|
|
|
|
|
|
<style type="text/css"> |
|
|
|
|
|
body { |
|
|
|
|
|
color: #4D4D4D; |
|
|
|
|
|
font: 10pt arial; |
|
|
|
|
|
} |
|
|
|
|
|
</style> |
|
|
|
|
|
|
|
|
|
|
|
</head> |
|
|
|
|
|
|
|
|
|
|
|
<body> |
|
|
|
|
|
<h1>Timeline visible Groups</h1> |
|
|
|
|
|
|
|
|
|
|
|
<button onclick="showVisibleGroups()">Show current visible items</button> |
|
|
|
|
|
<div> |
|
|
|
|
|
<h2>visible groups:</h2> |
|
|
|
|
|
<h3 id="visibleGroupsContainer"></h3> |
|
|
|
|
|
<h2>(Scroll with the mouse and see the items being focus automatically on the timeline)</h2> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<div id="mytimeline"></div> |
|
|
|
|
|
<br> |
|
|
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
|
|
function showVisibleGroups() { |
|
|
|
|
|
var a = timeline.getVisibleGroups(); |
|
|
|
|
|
document.getElementById("visibleGroupsContainer").innerHTML = "" |
|
|
|
|
|
document.getElementById("visibleGroupsContainer").innerHTML += a; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var now = Date.now() |
|
|
|
|
|
|
|
|
|
|
|
var options = { |
|
|
|
|
|
stack: true, |
|
|
|
|
|
maxHeight: 640, |
|
|
|
|
|
horizontalScroll: false, |
|
|
|
|
|
verticalScroll: true, |
|
|
|
|
|
zoomKey: "ctrlKey", |
|
|
|
|
|
start: Date.now() - 1000 * 60 * 60 * 24 * 3, // minus 3 days |
|
|
|
|
|
end: Date.now() + 1000 * 60 * 60 * 24 * 21, // plus 1 months aprox. |
|
|
|
|
|
orientation: { |
|
|
|
|
|
axis: "both", |
|
|
|
|
|
item: "top" |
|
|
|
|
|
}, |
|
|
|
|
|
}; |
|
|
|
|
|
var groups = new vis.DataSet(); |
|
|
|
|
|
var items = new vis.DataSet(); |
|
|
|
|
|
|
|
|
|
|
|
var count = 300; |
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < count; i++) { |
|
|
|
|
|
var start = now + 1000 * 60 * 60 * 24 * (i + Math.floor(Math.random() * 7)) |
|
|
|
|
|
var end = start + 1000 * 60 * 60 * 24 * (1 + Math.floor(Math.random() * 5)) |
|
|
|
|
|
|
|
|
|
|
|
groups.add({ |
|
|
|
|
|
id: i, |
|
|
|
|
|
content: 'Task ' + i, |
|
|
|
|
|
order: i |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
items.add({ |
|
|
|
|
|
id: i, |
|
|
|
|
|
group: i, |
|
|
|
|
|
start: start, |
|
|
|
|
|
end: end, |
|
|
|
|
|
type: 'range', |
|
|
|
|
|
content: 'Item ' + i |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// create a Timeline |
|
|
|
|
|
var container = document.getElementById('mytimeline'); |
|
|
|
|
|
timeline = new vis.Timeline(container, null, options); |
|
|
|
|
|
timeline.setGroups(groups); |
|
|
|
|
|
timeline.setItems(items); |
|
|
|
|
|
|
|
|
|
|
|
function debounce(func, wait = 100) { |
|
|
|
|
|
let timeout; |
|
|
|
|
|
return function (...args) { |
|
|
|
|
|
clearTimeout(timeout); |
|
|
|
|
|
timeout = setTimeout(() => { |
|
|
|
|
|
func.apply(this, args); |
|
|
|
|
|
}, wait); |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let groupFocus = (e) => { |
|
|
|
|
|
let vGroups = timeline.getVisibleGroups() |
|
|
|
|
|
let vItems = vGroups.reduce((res, groupId) => { |
|
|
|
|
|
let group = timeline.itemSet.groups[groupId] |
|
|
|
|
|
if (group.items) { |
|
|
|
|
|
res = res.concat(Object.keys(group.items)) |
|
|
|
|
|
} |
|
|
|
|
|
return res |
|
|
|
|
|
}, []) |
|
|
|
|
|
timeline.focus(vItems) |
|
|
|
|
|
} |
|
|
|
|
|
this.timeline.on("scroll", debounce(groupFocus, 200)) |
|
|
|
|
|
// Enabling the next line leads to a continuous since calling focus might scroll vertically even if it shouldn't |
|
|
|
|
|
// this.timeline.on("scrollSide", debounce(groupFocus, 200)) |
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
|
|
</body> |
|
|
|
|
|
|
|
|
|
|
|
</html> |