| <!DOCTYPE HTML> | |
| <html> | |
| <head> | |
|   <title>Graph2d | External legend Example</title> | |
|   <link href="../../dist/vis-timeline-graph2d.min.css" rel="stylesheet" type="text/css" /> | |
|   <style type="text/css"> | |
|     body, html { | |
|       font-family: sans-serif; | |
|     } | |
| 
 | |
|     .custom-style1 { | |
|       fill: #f2ea00; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #b3ab00; | |
|     } | |
| 
 | |
|     .custom-style2 { | |
|       fill: #00a0f2; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #050092; | |
|     } | |
| 
 | |
|     .custom-style3 { | |
|       fill: #00f201; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #029200; | |
|     } | |
| 
 | |
|     path.custom-style3.fill { | |
|       fill-opacity:0.5 !important; | |
|       stroke: none; | |
|     } | |
| 
 | |
|     .vis-graph-group0 { | |
|       fill:#4f81bd; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #4f81bd; | |
|     } | |
| 
 | |
|     .vis-graph-group1 { | |
|       fill:#f79646; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #f79646; | |
|     } | |
| 
 | |
|     .vis-graph-group2 { | |
|       fill: #8c51cf; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #8c51cf; | |
|     } | |
| 
 | |
|     .vis-graph-group3 { | |
|       fill: #75c841; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #75c841; | |
|     } | |
| 
 | |
|     .vis-graph-group4 { | |
|       fill: #ff0100; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #ff0100; | |
|     } | |
| 
 | |
|     .vis-graph-group5 { | |
|       fill: #37d8e6; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #37d8e6; | |
|     } | |
| 
 | |
|     .vis-graph-group6 { | |
|       fill: #042662; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #042662; | |
|     } | |
| 
 | |
|     .vis-graph-group7 { | |
|       fill:#00ff26; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #00ff26; | |
|     } | |
| 
 | |
|     .vis-graph-group8 { | |
|       fill:#ff00ff; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #ff00ff; | |
|     } | |
| 
 | |
|     .vis-graph-group9 { | |
|       fill: #8f3938; | |
|       fill-opacity:0; | |
|       stroke-width:2px; | |
|       stroke: #8f3938; | |
|     } | |
| 
 | |
|     .vis-fill { | |
|       fill-opacity:0.1; | |
|       stroke: none; | |
|     } | |
| 
 | |
| 
 | |
|     .vis-bar { | |
|       fill-opacity:0.5; | |
|       stroke-width:1px; | |
|     } | |
| 
 | |
|     .vis-point { | |
|       stroke-width:2px; | |
|       fill-opacity:1.0; | |
|     } | |
| 
 | |
| 
 | |
|     .vis-legend-background { | |
|       stroke-width:1px; | |
|       fill-opacity:0.9; | |
|       fill: #ffffff; | |
|       stroke: #c2c2c2; | |
|     } | |
| 
 | |
| 
 | |
|     .vis-outline { | |
|       stroke-width:1px; | |
|       fill-opacity:1; | |
|       fill: #ffffff; | |
|       stroke: #e5e5e5; | |
|     } | |
| 
 | |
|     .vis-icon-fill { | |
|       fill-opacity:0.3; | |
|       stroke: none; | |
|     } | |
| 
 | |
|     div.description-container { | |
|       float:left; | |
|       height:30px; | |
|       width:160px; | |
|       padding-left:5px; | |
|       padding-right:5px; | |
|       line-height: 30px; | |
|     } | |
| 
 | |
|     div.icon-container { | |
|       float:left; | |
|     } | |
| 
 | |
|     div.legend-element-container { | |
|       display:inline-block; | |
|       width:200px; | |
|       height:30px; | |
|       border-style:solid; | |
|       border-width:1px; | |
|       border-color: #e0e0e0; | |
|       background-color: #ffffff; | |
|       margin:4px; | |
|       padding:4px; | |
|       -webkit-touch-callout: none; | |
|       -webkit-user-select: none; | |
|       -khtml-user-select: none; | |
|       -moz-user-select: none; | |
|       -ms-user-select: none; | |
|       user-select: none; | |
|       cursor:pointer; | |
|     } | |
|     div.legend-element-container.hidden { | |
|       background-color: #d3e6ff; | |
|     } | |
| 
 | |
|     svg.legend-icon { | |
|       width:30px; | |
|       height:30px; | |
|     } | |
| 
 | |
|     div.external-legend { | |
|       position:relative; | |
|       margin-left: -5px; | |
|       width: 900px; | |
|     } | |
|   </style> | |
| 
 | |
|   <script src="../../dist/vis.js"></script> | |
| 
 | |
|   <script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create', 'UA-61231638-1', 'auto');ga('send', 'pageview');</script></head> | |
| <body> | |
| <h2>Graph2d | External custom legend</h2> | |
| <div style="width:800px; font-size:14px; text-align: justify;"> | |
|   This example shows how to create an external custom legend using the getLegend function. We use normal JavaScript to show and hide the | |
|   groups by updating the dataset. | |
| 
 | |
| </div> | |
| <br /> | |
| <div id="Legend" class="external-legend"></div> | |
| <div id="visualization"></div> | |
| 
 | |
| 
 | |
| <script type="text/javascript"> | |
|   // create a dataSet with groups | |
|   var names = ['SquareShaded', 'Bargraph', 'Blank', 'CircleShaded']; | |
|   var groups = new vis.DataSet(); | |
|   groups.add({ | |
|     id: 0, | |
|     content: names[0], | |
|     className: 'custom-style1', | |
|     options: { | |
|       drawPoints: { | |
|         style: 'square' // square, circle | |
|       }, | |
|       shaded: { | |
|         orientation: 'bottom' // top, bottom | |
|       } | |
|     }}); | |
| 
 | |
|   groups.add({ | |
|     id: 1, | |
|     content: names[1], | |
|     className: 'custom-style2', | |
|     options: { | |
|       style:'bar', | |
|       drawPoints: {style: 'circle', | |
|         size: 10 | |
|       } | |
|     }}); | |
| 
 | |
|   groups.add({ | |
|     id: 2, | |
|     content: names[2], | |
|     options: { | |
|       yAxisOrientation: 'right', // right, left | |
|       drawPoints: false | |
|     } | |
|   }); | |
| 
 | |
|   groups.add({ | |
|     id: 3, | |
|     content: names[3], | |
|     className: 'custom-style3', | |
|     options: { | |
|       yAxisOrientation: 'right', // right, left | |
|       drawPoints: { | |
|         style: 'circle' // square, circle | |
|       }, | |
|       shaded: { | |
|         orientation: 'top' // top, bottom | |
|       } | |
|     }}); | |
| 
 | |
|   var container = document.getElementById('visualization'); | |
|   var items = [ | |
|     {x: '2014-06-12', y: 0 , group: 0}, | |
|     {x: '2014-06-13', y: 30, group: 0}, | |
|     {x: '2014-06-14', y: 10, group: 0}, | |
|     {x: '2014-06-15', y: 15, group: 1}, | |
|     {x: '2014-06-16', y: 30, group: 1}, | |
|     {x: '2014-06-17', y: 10, group: 1}, | |
|     {x: '2014-06-18', y: 15, group: 1}, | |
|     {x: '2014-06-19', y: 52, group: 1}, | |
|     {x: '2014-06-20', y: 10, group: 1}, | |
|     {x: '2014-06-21', y: 20, group: 2}, | |
|     {x: '2014-06-22', y: 600, group: 2}, | |
|     {x: '2014-06-23', y: 100, group: 2}, | |
|     {x: '2014-06-24', y: 250, group: 2}, | |
|     {x: '2014-06-25', y: 300, group: 2}, | |
|     {x: '2014-06-26', y: 200, group: 3}, | |
|     {x: '2014-06-27', y: 600, group: 3}, | |
|     {x: '2014-06-28', y: 1000, group: 3}, | |
|     {x: '2014-06-29', y: 250, group: 3}, | |
|     {x: '2014-06-30', y: 300, group: 3} | |
|   ]; | |
| 
 | |
|   var dataset = new vis.DataSet(items); | |
|   var options = { | |
|     dataAxis: {showMinorLabels: false}, | |
|     start: '2014-06-09', | |
|     end: '2014-07-03' | |
|   }; | |
|   var graph2d = new vis.Graph2d(container, items, groups, options); | |
| 
 | |
| 
 | |
|   /** | |
|    * this function fills the external legend with content using the getLegend() function. | |
|    */ | |
|   function populateExternalLegend() { | |
|     var groupsData = groups.get(); | |
|     var legendDiv = document.getElementById("Legend"); | |
|     legendDiv.innerHTML = ""; | |
| 
 | |
|     // get for all groups: | |
|     for (var i = 0; i < groupsData.length; i++) { | |
|       // create divs | |
|       var containerDiv = document.createElement("div"); | |
|       var iconDiv = document.createElement("div"); | |
|       var descriptionDiv = document.createElement("div"); | |
| 
 | |
|       // give divs classes and Ids where necessary | |
|       containerDiv.className = 'legend-element-container'; | |
|       containerDiv.id = groupsData[i].id + "_legendContainer" | |
|       iconDiv.className = "icon-container"; | |
|       descriptionDiv.className = "description-container"; | |
| 
 | |
|       // get the legend for this group. | |
|       var legend = graph2d.getLegend(groupsData[i].id,30,30); | |
| 
 | |
|       // append class to icon. All styling classes from the vis.css/vis-timeline-graph2d.min.css have been copied over into the head here to be able to style the | |
|       // icons with the same classes if they are using the default ones. | |
|       legend.icon.setAttributeNS(null, "class", "legend-icon"); | |
| 
 | |
|       // append the legend to the corresponding divs | |
|       iconDiv.appendChild(legend.icon); | |
|       descriptionDiv.innerHTML = legend.label; | |
| 
 | |
|       // determine the order for left and right orientation | |
|       if (legend.orientation == 'left') { | |
|         descriptionDiv.style.textAlign = "left"; | |
|         containerDiv.appendChild(iconDiv); | |
|         containerDiv.appendChild(descriptionDiv); | |
|       } | |
|       else { | |
|         descriptionDiv.style.textAlign = "right"; | |
|         containerDiv.appendChild(descriptionDiv); | |
|         containerDiv.appendChild(iconDiv); | |
|       } | |
| 
 | |
|       // append to the legend container div | |
|       legendDiv.appendChild(containerDiv); | |
| 
 | |
|       // bind click event to this legend element. | |
|       containerDiv.onclick = toggleGraph.bind(this,groupsData[i].id); | |
|     } | |
|   } | |
| 
 | |
|   /** | |
|    * This function switchs the visible option of the selected group on an off. | |
|    * @param groupId | |
|    */ | |
|   function toggleGraph(groupId) { | |
|     // get the container that was clicked on. | |
|     var container = document.getElementById(groupId + "_legendContainer") | |
|     // if visible, hide | |
|     if (graph2d.isGroupVisible(groupId) == true) { | |
|       groups.update({id:groupId, visible:false}); | |
|       container.className = container.className + " hidden"; | |
|     } | |
|     else { // if invisible, show | |
|       groups.update({id:groupId, visible:true}); | |
|       container.className = container.className.replace("hidden",""); | |
|     } | |
|   } | |
| 
 | |
|   populateExternalLegend() | |
| 
 | |
| </script> | |
| </body> | |
| </html>
 |