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