| @ -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> | |||