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