]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Add tooltipFormat option to time scale options. 1744/head
authorEvert Timberg <evert.timberg@gmail.com>
Sat, 5 Dec 2015 21:45:31 +0000 (16:45 -0500)
committerEvert Timberg <evert.timberg@gmail.com>
Sun, 6 Dec 2015 00:33:33 +0000 (19:33 -0500)
Fix bars when displayed on a time scale.
Updated sample files.

docs/01-Scales.md
samples/timeScale/combo-time-scale.html
samples/timeScale/line-time-point-data.html
samples/timeScale/line-time-scale.html
src/controllers/controller.bar.js
src/core/core.scale.js
src/scales/scale.time.js
test/scale.time.tests.js

index be4872dd0e334d82727d4925932626b7322371d1..428a911e8f31cf3b604796d550d7344fbb1a2019 100644 (file)
@@ -153,16 +153,18 @@ The time scale extends the core scale class with the following tick template:
                // Moment js for each of the units. Replaces `displayFormat`
                // To override, use a pattern string from http://momentjs.com/docs/#/displaying/format/
                displayFormats: {
-                               'millisecond': 'SSS [ms]',
-                               'second': 'h:mm:ss a', // 11:20:01 AM
-                               'minute': 'h:mm:ss a', // 11:20:01 AM
-                               'hour': 'MMM D, hA', // Sept 4, 5PM
-                               'day': 'll', // Sep 4 2015
-                               'week': 'll', // Week 46, or maybe "[W]WW - YYYY" ?
-                               'month': 'MMM YYYY', // Sept 2015
-                               'quarter': '[Q]Q - YYYY', // Q3
-                               'year': 'YYYY', // 2015
-                       }, 
+                       'millisecond': 'SSS [ms]',
+                       'second': 'h:mm:ss a', // 11:20:01 AM
+                       'minute': 'h:mm:ss a', // 11:20:01 AM
+                       'hour': 'MMM D, hA', // Sept 4, 5PM
+                       'day': 'll', // Sep 4 2015
+                       'week': 'll', // Week 46, or maybe "[W]WW - YYYY" ?
+                       'month': 'MMM YYYY', // Sept 2015
+                       'quarter': '[Q]Q - YYYY', // Q3
+                       'year': 'YYYY', // 2015
+               },
+               // Sets the display format used in tooltip generation
+               tooltipFormat: ''
        },
 }
 ```
index 939be9282f6d10cd097543877263acf78d48e9ed..590c2a90eac83808614bb0fad967de274d695688 100644 (file)
 <html>
 
 <head>
-    <title>Line Chart</title>
-    <script src="../node_modules/moment/min/moment.min.js"></script>
-    <script src="../Chart.js"></script>
-    <script src="../node_modules/jquery/dist/jquery.min.js"></script>
-    <style>
-        canvas {
-            -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, .5);
-        }
-    </style>
+       <title>Line Chart</title>
+       <script src="../../node_modules/moment/min/moment.min.js"></script>
+       <script src="../../Chart.js"></script>
+       <script src="../../node_modules/jquery/dist/jquery.min.js"></script>
+       <style>
+               canvas {
+                       -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, .5);
+               }
+       </style>
 </head>
 
 <body>
-    <div style="width:100%;">
-        <canvas id="canvas" style="width:100%;height:100%"></canvas>
-    </div>
-    <br>
-    <br>
-    <button id="randomizeData">Randomize Data</button>
-    <button id="addDataset">Add Dataset</button>
-    <button id="removeDataset">Remove Dataset</button>
-    <button id="addData">Add Data</button>
-    <button id="removeData">Remove Data</button>
-    <div>
-        <h3>Legend</h3>
-        <div id="legendContainer">
-        </div>
-    </div>
-    <script>
-        var randomScalingFactor = function() {
-            return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
-        };
-        var randomColorFactor = function() {
-            return Math.round(Math.random() * 255);
-        };
-        var randomColor = function(opacity) {
-            return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
-        };
-        var newDate = function(days) {
-            var date = new Date();
-            return date.setDate(date.getDate() + days);
-        };
-        var newTimestamp = function(days) {
-            return Date.now() - days * 100000;
-        };
-
-        var config = {
-            type: 'bar',
-            data: {
-                //labels: [newTimestamp(0), newTimestamp(1), newTimestamp(2), newTimestamp(3), newTimestamp(4), newTimestamp(5), newTimestamp(6)], // unix timestamps
-                // labels: [newDate(0), newDate(1), newDate(2), newDate(3), newDate(4), newDate(5), newDate(6)], // Date Objects
-                labels: ["01/01/2015 20:00", "01/02/2015 20:00", "01/03/2015 22:00", "01/05/2015 23:00", "01/07/2015 03:00", "01/08/2015 10:00", "01/10/2015"], // Hours
-                // labels: ["01/01/2015", "01/02/2015", "01/03/2015", "01/06/2015", "01/15/2015", "01/17/2015", "01/30/2015"], // Days
-                // labels: ["12/25/2014", "01/08/2015", "01/15/2015", "01/22/2015", "01/29/2015", "02/05/2015", "02/12/2015"], // Weeks
-                datasets: [{
-                    type: 'bar',
-                    label: 'Dataset 1',
-                    backgroundColor: "rgba(151,187,205,0.5)",
-                    data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
-                    borderColor: 'white',
-                    borderWidth: 2
-                }, {
-                    type: 'bar',
-                    label: 'Dataset 2',
-                    backgroundColor: "rgba(151,187,205,0.5)",
-                    data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
-                    borderColor: 'white',
-                    borderWidth: 2
-                }, {
-                    type: 'line',
-                    label: 'Dataset 3',
-                    backgroundColor: "rgba(220,220,220,0.5)",
-                    data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
-                }, ]
-            },
-            options: {
-                responsive: true,
-                scales: {
-                    xAxes: [{
-                        type: "time",
-                        display: true,
-                        time: {
-                            format: 'MM/DD/YYYY HH:mm',
-                            // round: 'day'
-                        }
-                    }, ],
-                    yAxes: [{
-                        display: true
-                    }]
-                },
-                elements: {
-                    line: {
-                        tension: 0.3
-                    }
-                },
-            }
-        };
-
-        $.each(config.data.datasets, function(i, dataset) {
-            dataset.borderColor = randomColor(0.4);
-            dataset.backgroundColor = randomColor(0.5);
-            dataset.pointBorderColor = randomColor(0.7);
-            dataset.pointBackgroundColor = randomColor(0.5);
-            dataset.pointBorderWidth = 1;
-        });
-
-        console.log(config.data);
-
-        window.onload = function() {
-            var ctx = document.getElementById("canvas").getContext("2d");
-            window.myLine = new Chart(ctx, config);
-
-            updateLegend();
-        };
-
-        function updateLegend() {
-            $legendContainer = $('#legendContainer');
-            $legendContainer.empty();
-            $legendContainer.append(window.myLine.generateLegend());
-        }
-
-        $('#randomizeData').click(function() {
-            $.each(config.data.datasets, function(i, dataset) {
-                dataset.data = dataset.data.map(function() {
-                    return randomScalingFactor();
-                });
-            });
-
-            window.myLine.update();
-            updateLegend();
-        });
-
-        $('#addDataset').click(function() {
-            var newDataset = {
-                label: 'Dataset ' + config.data.datasets.length,
-                borderColor: randomColor(0.4),
-                backgroundColor: randomColor(0.5),
-                pointBorderColor: randomColor(0.7),
-                pointBackgroundColor: randomColor(0.5),
-                pointBorderWidth: 1,
-                data: [],
-            };
-
-            for (var index = 0; index < config.data.labels.length; ++index) {
-                newDataset.data.push(randomScalingFactor());
-            }
-
-            config.data.datasets.push(newDataset);
-            window.myLine.update();
-            updateLegend();
-        });
-
-        $('#addData').click(function() {
-            if (config.data.datasets.length > 0) {
-                config.data.labels.push(
-                    myLine.scales['x-axis-0'].labelMoments[myLine.scales['x-axis-0'].labelMoments.length - 1].add(1, 'day')
-                    .format('MM/DD/YYYY')
-                );
-
-                for (var index = 0; index < config.data.datasets.length; ++index) {
-                    config.data.datasets[index].data.push(randomScalingFactor());
-                }
-
-                window.myLine.update();
-                updateLegend();
-            }
-        });
-
-        $('#removeDataset').click(function() {
-            config.data.datasets.splice(0, 1);
-            window.myLine.update();
-            updateLegend();
-        });
-
-        $('#removeData').click(function() {
-            config.data.labels.splice(-1, 1); // remove the label first
-
-            config.data.datasets.forEach(function(dataset, datasetIndex) {
-                config.data.datasets[datasetIndex].data.pop();
-            });
-
-            window.myLine.update();
-            updateLegend();
-        });
-    </script>
+       <div style="width:100%;">
+               <canvas id="canvas" style="width:100%;height:100%"></canvas>
+       </div>
+       <br>
+       <br>
+       <button id="randomizeData">Randomize Data</button>
+       <button id="addDataset">Add Dataset</button>
+       <button id="removeDataset">Remove Dataset</button>
+       <button id="addData">Add Data</button>
+       <button id="removeData">Remove Data</button>
+       <div>
+               <h3>Legend</h3>
+               <div id="legendContainer">
+               </div>
+       </div>
+       <script>
+               var timeFormat = 'MM/DD/YYYY HH:mm';
+
+               function randomScalingFactor() {
+                       return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
+               }
+
+               function randomColorFactor() {
+                       return Math.round(Math.random() * 255);
+               }
+
+               function randomColor(opacity) {
+                       return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
+               }
+
+               function newDateString(days) {
+                       return moment().add(days, 'd').format(timeFormat);
+               }
+
+               var config = {
+                       type: 'bar',
+                       data: {
+                               labels: [newDateString(0), newDateString(1), newDateString(2), newDateString(3), newDateString(4), newDateString(5), newDateString(6)],
+                               datasets: [{
+                                       type: 'bar',
+                                       label: 'Dataset 1',
+                                       backgroundColor: "rgba(151,187,205,0.5)",
+                                       data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
+                                       borderColor: 'white',
+                                       borderWidth: 2
+                               }, {
+                                       type: 'bar',
+                                       label: 'Dataset 2',
+                                       backgroundColor: "rgba(151,187,205,0.5)",
+                                       data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
+                                       borderColor: 'white',
+                                       borderWidth: 2
+                               }, {
+                                       type: 'line',
+                                       label: 'Dataset 3',
+                                       backgroundColor: "rgba(220,220,220,0.5)",
+                                       data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
+                               }, ]
+                       },
+                       options: {
+                               responsive: true,
+                               scales: {
+                                       xAxes: [{
+                                               type: "time",
+                                               display: true,
+                                               time: {
+                                                       format: timeFormat,
+                                                       // round: 'day'
+                                               }
+                                       }],
+                               },
+                       }
+               };
+
+               $.each(config.data.datasets, function(i, dataset) {
+                       dataset.borderColor = randomColor(0.4);
+                       dataset.backgroundColor = randomColor(0.5);
+                       dataset.pointBorderColor = randomColor(0.7);
+                       dataset.pointBackgroundColor = randomColor(0.5);
+                       dataset.pointBorderWidth = 1;
+               });
+
+               console.log(config.data);
+
+               window.onload = function() {
+                       var ctx = document.getElementById("canvas").getContext("2d");
+                       window.myLine = new Chart(ctx, config);
+
+                       updateLegend();
+               };
+
+               function updateLegend() {
+                       $legendContainer = $('#legendContainer');
+                       $legendContainer.empty();
+                       $legendContainer.append(window.myLine.generateLegend());
+               }
+
+               $('#randomizeData').click(function() {
+                       $.each(config.data.datasets, function(i, dataset) {
+                               dataset.data = dataset.data.map(function() {
+                                       return randomScalingFactor();
+                               });
+                       });
+
+                       window.myLine.update();
+                       updateLegend();
+               });
+
+               $('#addDataset').click(function() {
+                       var newDataset = {
+                               label: 'Dataset ' + config.data.datasets.length,
+                               borderColor: randomColor(0.4),
+                               backgroundColor: randomColor(0.5),
+                               pointBorderColor: randomColor(0.7),
+                               pointBackgroundColor: randomColor(0.5),
+                               pointBorderWidth: 1,
+                               data: [],
+                       };
+
+                       for (var index = 0; index < config.data.labels.length; ++index) {
+                               newDataset.data.push(randomScalingFactor());
+                       }
+
+                       config.data.datasets.push(newDataset);
+                       window.myLine.update();
+                       updateLegend();
+               });
+
+               $('#addData').click(function() {
+                       if (config.data.datasets.length > 0) {
+                               config.data.labels.push(
+                                       myLine.scales['x-axis-0'].labelMoments[myLine.scales['x-axis-0'].labelMoments.length - 1].add(1, 'day')
+                                       .format('MM/DD/YYYY')
+                               );
+
+                               for (var index = 0; index < config.data.datasets.length; ++index) {
+                                       config.data.datasets[index].data.push(randomScalingFactor());
+                               }
+
+                               window.myLine.update();
+                               updateLegend();
+                       }
+               });
+
+               $('#removeDataset').click(function() {
+                       config.data.datasets.splice(0, 1);
+                       window.myLine.update();
+                       updateLegend();
+               });
+
+               $('#removeData').click(function() {
+                       config.data.labels.splice(-1, 1); // remove the label first
+
+                       config.data.datasets.forEach(function(dataset, datasetIndex) {
+                               config.data.datasets[datasetIndex].data.pop();
+                       });
+
+                       window.myLine.update();
+                       updateLegend();
+               });
+       </script>
 </body>
 
 </html>
index 2d8077acf4f205ad20ce65b2def30a77c3c934a2..d02805eccc4805154c232bb4a38bc03ec70d329b 100644 (file)
 <html>
 
 <head>
-    <title>Time Scale Point Data</title>
-    <script src="../node_modules/moment/min/moment.min.js"></script>
-    <script src="../Chart.js"></script>
-    <script src="../node_modules/jquery/dist/jquery.min.js"></script>
-    <style>
-        canvas {
-            -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, .5);
-        }
-    </style>
+       <title>Time Scale Point Data</title>
+       <script src="../../node_modules/moment/min/moment.min.js"></script>
+       <script src="../../Chart.js"></script>
+       <script src="../../node_modules/jquery/dist/jquery.min.js"></script>
+       <style>
+               canvas {
+                       -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, .5);
+               }
+       </style>
 </head>
 
 <body>
-    <div style="width:100%;">
-        <canvas id="canvas" style="width:100%;height:100%"></canvas>
-    </div>
-    <br>
-    <br>
-    <button id="randomizeData">Randomize Data</button>
-    <button id="addData">Add Data</button>
-    <button id="removeData">Remove Data</button>
-    <div>
-        <h3>Legend</h3>
-        <div id="legendContainer">
-        </div>
-    </div>
-    <script>
-        var randomScalingFactor = function() {
-            return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
-        };
-        var randomColorFactor = function() {
-            return Math.round(Math.random() * 255);
-        };
-        var randomColor = function(opacity) {
-            return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
-        };
-        var newDate = function(days) {
-            var date = new Date();
-            return date.setDate(date.getDate() + days);
-        };
-        var newTimestamp = function(days) {
-            return Date.now() - days * 100000;
-        };
-
-        var config = {
-            type: 'line',
-            data: {
-                datasets: [{
-                    label: "Dataset with point data",
-                    data: [{
-                        x: "12/31/2014 06:00",
-                        y: randomScalingFactor()
-                    }, {
-                        x: "01/04/2015 13:00",
-                        y: randomScalingFactor()
-                    }, {
-                        x: "01/07/2015 01:15",
-                        y: randomScalingFactor()
-                    }, {
-                        x: "01/15/2015 01:15",
-                        y: randomScalingFactor()
-                    }],
-                    fill: false
-                }]
-            },
-            options: {
-                responsive: true,
-                scales: {
-                    xAxes: [{
-                        type: "time",
-                        display: true,
-                        time: {
-                            format: 'MM/DD/YYYY HH:mm',
-                            // round: 'day'
-                        },
-                        scaleLabel: {
-                            display: true,
-                            labelString: 'Date'
-                        }
-                    }, ],
-                    yAxes: [{
-                        display: true,
-                        scaleLabel: {
-                            display: true,
-                            labelString: 'value'
-                        }
-                    }]
-                },
-                elements: {
-                    line: {
-                        tension: 0.3
-                    }
-                },
-            }
-        };
-
-        $.each(config.data.datasets, function(i, dataset) {
-            dataset.borderColor = randomColor(0.4);
-            dataset.backgroundColor = randomColor(0.5);
-            dataset.pointBorderColor = randomColor(0.7);
-            dataset.pointBackgroundColor = randomColor(0.5);
-            dataset.pointBorderWidth = 1;
-        });
-
-        console.log(config.data);
-
-        window.onload = function() {
-            var ctx = document.getElementById("canvas").getContext("2d");
-            window.myLine = new Chart(ctx, config);
-
-            updateLegend();
-        };
-
-        function updateLegend() {
-            $legendContainer = $('#legendContainer');
-            $legendContainer.empty();
-            $legendContainer.append(window.myLine.generateLegend());
-        }
-
-        $('#randomizeData').click(function() {
-            $.each(config.data.datasets, function(i, dataset) {
-                dataset.data = dataset.data.map(function() {
-                    return randomScalingFactor();
-                });
-            });
-
-            window.myLine.update();
-            updateLegend();
-        });
-
-        $('#addData').click(function() {
-            if (config.data.datasets.length > 0) {
-                var newTime = myLine.scales['x-axis-0'].labelMoments[0][myLine.scales['x-axis-0'].labelMoments[0].length - 1]
-                    .clone()
-                    .add(1, 'day')
-                    .format('MM/DD/YYYY HH:mm');
-
-                for (var index = 0; index < config.data.datasets.length; ++index) {
-                    config.data.datasets[index].data.push({
-                        x: newTime,
-                        y: randomScalingFactor()
-                    });
-                }
-
-                window.myLine.update();
-                updateLegend();
-            }
-        });
-
-        $('#removeData').click(function() {
-            config.data.datasets.forEach(function(dataset, datasetIndex) {
-                dataset.data.pop();
-            });
-
-            window.myLine.update();
-            updateLegend();
-        });
-    </script>
+       <div style="width:100%;">
+               <canvas id="canvas" style="width:100%;height:100%"></canvas>
+       </div>
+       <br>
+       <br>
+       <button id="randomizeData">Randomize Data</button>
+       <button id="addData">Add Data</button>
+       <button id="removeData">Remove Data</button>
+       <div>
+               <h3>Legend</h3>
+               <div id="legendContainer">
+               </div>
+       </div>
+       <script>
+               function randomScalingFactor() {
+                       return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
+               }
+
+               function randomColorFactor() {
+                       return Math.round(Math.random() * 255);
+               }
+
+               function randomColor(opacity) {
+                       return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
+               }
+
+               function newDate(days) {
+                       return moment().add(days, 'd').toDate();
+               }
+               
+               function newDateString(days) {
+                       return moment().add(days, 'd').format();
+               }
+
+               var config = {
+                       type: 'line',
+                       data: {
+                               datasets: [{
+                                       label: "Dataset with string point data",
+                                       data: [{
+                                               x: newDateString(0),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDateString(2),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDateString(4),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDateString(5),
+                                               y: randomScalingFactor()
+                                       }],
+                                       fill: false
+                               }, {
+                                       label: "Dataset with date object point data",
+                                       data: [{
+                                               x: newDate(0),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDate(2),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDate(4),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDate(5),
+                                               y: randomScalingFactor()
+                                       }],
+                                       fill: false
+                               }]
+                       },
+                       options: {
+                               responsive: true,
+                               scales: {
+                                       xAxes: [{
+                                               type: "time",
+                                               display: true,
+                                               scaleLabel: {
+                                                       display: true,
+                                                       labelString: 'Date'
+                                               }
+                                       }, ],
+                                       yAxes: [{
+                                               display: true,
+                                               scaleLabel: {
+                                                       display: true,
+                                                       labelString: 'value'
+                                               }
+                                       }]
+                               }
+                       }
+               };
+
+               $.each(config.data.datasets, function(i, dataset) {
+                       dataset.borderColor = randomColor(0.4);
+                       dataset.backgroundColor = randomColor(0.5);
+                       dataset.pointBorderColor = randomColor(0.7);
+                       dataset.pointBackgroundColor = randomColor(0.5);
+                       dataset.pointBorderWidth = 1;
+               });
+
+               window.onload = function() {
+                       var ctx = document.getElementById("canvas").getContext("2d");
+                       window.myLine = new Chart(ctx, config);
+
+                       updateLegend();
+               };
+
+               function updateLegend() {
+                       $legendContainer = $('#legendContainer');
+                       $legendContainer.empty();
+                       $legendContainer.append(window.myLine.generateLegend());
+               }
+
+               $('#randomizeData').click(function() {
+                       $.each(config.data.datasets, function(i, dataset) {
+                               $.each(dataset.data, function(j, dataObj) {
+                                       dataObj.y = randomScalingFactor();
+                               });
+                       });
+
+                       window.myLine.update();
+                       updateLegend();
+               });
+
+               $('#addData').click(function() {
+                       if (config.data.datasets.length > 0) {
+                               var newTime = myLine.scales['x-axis-0'].labelMoments[0][myLine.scales['x-axis-0'].labelMoments[0].length - 1]
+                                       .clone()
+                                       .add(1, 'day')
+                                       .format('MM/DD/YYYY HH:mm');
+
+                               for (var index = 0; index < config.data.datasets.length; ++index) {
+                                       config.data.datasets[index].data.push({
+                                               x: newTime,
+                                               y: randomScalingFactor()
+                                       });
+                               }
+
+                               window.myLine.update();
+                               updateLegend();
+                       }
+               });
+
+               $('#removeData').click(function() {
+                       config.data.datasets.forEach(function(dataset, datasetIndex) {
+                               dataset.data.pop();
+                       });
+
+                       window.myLine.update();
+                       updateLegend();
+               });
+       </script>
 </body>
 
 </html>
index ecde87573b274dd7d21bc89464fd7667277ac455..85cc9fde63da6a7ff7621dfc059de6fede84b50c 100644 (file)
 <html>
 
 <head>
-    <title>Line Chart</title>
-    <script src="../node_modules/moment/min/moment.min.js"></script>
-    <script src="../Chart.js"></script>
-    <script src="../node_modules/jquery/dist/jquery.min.js"></script>
-    <style>
-        canvas {
-            -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, .5);
-        }
-    </style>
+       <title>Line Chart</title>
+       <script src="../../node_modules/moment/min/moment.min.js"></script>
+       <script src="../../Chart.js"></script>
+       <script src="../../node_modules/jquery/dist/jquery.min.js"></script>
+       <style>
+               canvas {
+                       -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, .5);
+               }
+       </style>
 </head>
 
 <body>
-    <div style="width:100%;">
-        <canvas id="canvas" style="width:100%;height:100%"></canvas>
-    </div>
-    <br>
-    <br>
-    <button id="randomizeData">Randomize Data</button>
-    <button id="addDataset">Add Dataset</button>
-    <button id="removeDataset">Remove Dataset</button>
-    <button id="addData">Add Data</button>
-    <button id="removeData">Remove Data</button>
-    <div>
-        <h3>Legend</h3>
-        <div id="legendContainer">
-        </div>
-    </div>
-    <script>
-        var randomScalingFactor = function() {
-            return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
-        };
-        var randomColorFactor = function() {
-            return Math.round(Math.random() * 255);
-        };
-        var randomColor = function(opacity) {
-            return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
-        };
-        var newDate = function(days) {
-            var date = new Date();
-            return date.setDate(date.getDate() + days);
-        };
-        var newTimestamp = function(days) {
-            return Date.now() - days * 100000;
-        };
-
-        var config = {
-            type: 'line',
-            data: {
-                //labels: [newTimestamp(0), newTimestamp(1), newTimestamp(2), newTimestamp(3), newTimestamp(4), newTimestamp(5), newTimestamp(6)], // unix timestamps
-                // labels: [newDate(0), newDate(1), newDate(2), newDate(3), newDate(4), newDate(5), newDate(6)], // Date Objects
-                labels: ["01/01/2015 20:00", "01/02/2015 21:00", "01/03/2015 22:00", "01/05/2015 23:00", "01/07/2015 03:00", "01/08/2015 10:00", "01/10/2015"], // Hours
-                // labels: ["01/01/2015", "01/02/2015", "01/03/2015", "01/06/2015", "01/15/2015", "01/17/2015", "01/30/2015"], // Days
-                // labels: ["12/25/2014", "01/08/2015", "01/15/2015", "01/22/2015", "01/29/2015", "02/05/2015", "02/12/2015"], // Weeks
-                datasets: [{
-                    label: "My First dataset",
-                    data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
-                    fill: false,
-                    borderDash: [5, 5],
-                }, {
-                    label: "My Second dataset",
-                    data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
-                }, {
-                    label: "Dataset with point data",
-                    data: [{
-                        x: "12/31/2014 06:00",
-                        y: randomScalingFactor()
-                    }, {
-                        x: "01/04/2015 13:00",
-                        y: randomScalingFactor()
-                    }, {
-                        x: "01/07/2015 01:15",
-                        y: randomScalingFactor()
-                    }, {
-                        x: "01/15/2015 01:15",
-                        y: randomScalingFactor()
-                    }],
-                    fill: false
-                }]
-            },
-            options: {
-                responsive: true,
-                scales: {
-                    xAxes: [{
-                        type: "time",
-                        display: true,
-                        time: {
-                            format: 'MM/DD/YYYY HH:mm',
-                            // round: 'day'
-                        },
-                        scaleLabel: {
-                            display: true,
-                            labelString: 'Date'
-                        }
-                    }, ],
-                    yAxes: [{
-                        display: true,
-                        scaleLabel: {
-                            display: true,
-                            labelString: 'value'
-                        }
-                    }]
-                },
-                elements: {
-                    line: {
-                        tension: 0.3
-                    }
-                },
-            }
-        };
-
-        $.each(config.data.datasets, function(i, dataset) {
-            dataset.borderColor = randomColor(0.4);
-            dataset.backgroundColor = randomColor(0.5);
-            dataset.pointBorderColor = randomColor(0.7);
-            dataset.pointBackgroundColor = randomColor(0.5);
-            dataset.pointBorderWidth = 1;
-        });
-
-        console.log(config.data);
-
-        window.onload = function() {
-            var ctx = document.getElementById("canvas").getContext("2d");
-            window.myLine = new Chart(ctx, config);
-
-            updateLegend();
-        };
-
-        function updateLegend() {
-            $legendContainer = $('#legendContainer');
-            $legendContainer.empty();
-            $legendContainer.append(window.myLine.generateLegend());
-        }
-
-        $('#randomizeData').click(function() {
-            $.each(config.data.datasets, function(i, dataset) {
-                dataset.data = dataset.data.map(function() {
-                    return randomScalingFactor();
-                });
-            });
-
-            window.myLine.update();
-            updateLegend();
-        });
-
-        $('#addDataset').click(function() {
-            var newDataset = {
-                label: 'Dataset ' + config.data.datasets.length,
-                borderColor: randomColor(0.4),
-                backgroundColor: randomColor(0.5),
-                pointBorderColor: randomColor(0.7),
-                pointBackgroundColor: randomColor(0.5),
-                pointBorderWidth: 1,
-                data: [],
-            };
-
-            for (var index = 0; index < config.data.labels.length; ++index) {
-                newDataset.data.push(randomScalingFactor());
-            }
-
-            config.data.datasets.push(newDataset);
-            window.myLine.update();
-            updateLegend();
-        });
-
-        $('#addData').click(function() {
-            if (config.data.datasets.length > 0) {
-                config.data.labels.push(
-                    myLine.scales['x-axis-0'].labelMoments[myLine.scales['x-axis-0'].labelMoments.length - 1]
-                    .clone()
-                    .add(1, 'day')
-                    .format('MM/DD/YYYY HH:mm')
-                );
-
-                for (var index = 0; index < config.data.datasets.length; ++index) {
-                    config.data.datasets[index].data.push(randomScalingFactor());
-                }
-
-                window.myLine.update();
-                updateLegend();
-            }
-        });
-
-        $('#removeDataset').click(function() {
-            config.data.datasets.splice(0, 1);
-            window.myLine.update();
-            updateLegend();
-        });
-
-        $('#removeData').click(function() {
-            config.data.labels.splice(-1, 1); // remove the label first
-
-            config.data.datasets.forEach(function(dataset, datasetIndex) {
-                dataset.data.pop();
-            });
-
-            window.myLine.update();
-            updateLegend();
-        });
-    </script>
+       <div style="width:100%;">
+               <canvas id="canvas" style="width:100%;height:100%"></canvas>
+       </div>
+       <br>
+       <br>
+       <button id="randomizeData">Randomize Data</button>
+       <button id="addDataset">Add Dataset</button>
+       <button id="removeDataset">Remove Dataset</button>
+       <button id="addData">Add Data</button>
+       <button id="removeData">Remove Data</button>
+       <div>
+               <h3>Legend</h3>
+               <div id="legendContainer">
+               </div>
+       </div>
+       <script>
+               var timeFormat = 'MM/DD/YYYY HH:mm';
+               
+               function randomScalingFactor() {
+                       return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
+               }
+
+               function randomColorFactor() {
+                       return Math.round(Math.random() * 255);
+               }
+
+               function randomColor(opacity) {
+                       return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
+               }
+
+               function newDate(days) {
+                       return moment().add(days, 'd').toDate();
+               }
+               
+               function newDateString(days) {
+                       return moment().add(days, 'd').format(timeFormat);
+               }
+
+               function newTimestamp(days) {
+                       return moment().add(days, 'd').unix();
+               }
+
+               var config = {
+                       type: 'line',
+                       data: {
+                               labels: [newDate(0), newDate(1), newDate(2), newDate(3), newDate(4), newDate(5), newDate(6)], // Date Objects
+                               datasets: [{
+                                       label: "My First dataset",
+                                       data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
+                                       fill: false,
+                                       borderDash: [5, 5],
+                               }, {
+                                       label: "My Second dataset",
+                                       data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
+                               }, {
+                                       label: "Dataset with point data",
+                                       data: [{
+                                               x: newDateString(0),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDateString(5),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDateString(7),
+                                               y: randomScalingFactor()
+                                       }, {
+                                               x: newDateString(15),
+                                               y: randomScalingFactor()
+                                       }],
+                                       fill: false
+                               }]
+                       },
+                       options: {
+                               responsive: true,
+                               scales: {
+                                       xAxes: [{
+                                               type: "time",
+                                               time: {
+                                                       format: timeFormat,
+                                                       // round: 'day'
+                                                       tooltipFormat: 'll HH:mm'
+                                               },
+                                               scaleLabel: {
+                                                       display: true,
+                                                       labelString: 'Date'
+                                               }
+                                       }, ],
+                                       yAxes: [{
+                                               scaleLabel: {
+                                                       display: true,
+                                                       labelString: 'value'
+                                               }
+                                       }]
+                               },
+                       }
+               };
+
+               $.each(config.data.datasets, function(i, dataset) {
+                       dataset.borderColor = randomColor(0.4);
+                       dataset.backgroundColor = randomColor(0.5);
+                       dataset.pointBorderColor = randomColor(0.7);
+                       dataset.pointBackgroundColor = randomColor(0.5);
+                       dataset.pointBorderWidth = 1;
+               });
+
+               console.log(config.data);
+
+               window.onload = function() {
+                       var ctx = document.getElementById("canvas").getContext("2d");
+                       window.myLine = new Chart(ctx, config);
+
+                       updateLegend();
+               };
+
+               function updateLegend() {
+                       $legendContainer = $('#legendContainer');
+                       $legendContainer.empty();
+                       $legendContainer.append(window.myLine.generateLegend());
+               }
+
+               $('#randomizeData').click(function() {
+                       $.each(config.data.datasets, function(i, dataset) {
+                               $.each(dataset.data, function(j, dataObj) {
+                                       if (typeof dataObj === 'object') {
+                                               dataObj.y = randomScalingFactor();
+                                       } else {
+                                               dataset.data[j] = randomScalingFactor();
+                                       }
+                               });
+                       });
+
+                       window.myLine.update();
+                       updateLegend();
+               });
+
+               $('#addDataset').click(function() {
+                       var newDataset = {
+                               label: 'Dataset ' + config.data.datasets.length,
+                               borderColor: randomColor(0.4),
+                               backgroundColor: randomColor(0.5),
+                               pointBorderColor: randomColor(0.7),
+                               pointBackgroundColor: randomColor(0.5),
+                               pointBorderWidth: 1,
+                               data: [],
+                       };
+
+                       for (var index = 0; index < config.data.labels.length; ++index) {
+                               newDataset.data.push(randomScalingFactor());
+                       }
+
+                       config.data.datasets.push(newDataset);
+                       window.myLine.update();
+                       updateLegend();
+               });
+
+               $('#addData').click(function() {
+                       if (config.data.datasets.length > 0) {
+                               config.data.labels.push(newDate(config.data.labels.length));
+
+                               for (var index = 0; index < config.data.datasets.length; ++index) {
+                                       if (typeof config.data.datasets[index].data[0] === "object") {
+                                               config.data.datasets[index].data.push({
+                                                       x: newDate(config.data.datasets[index].data.length),
+                                                       y: randomScalingFactor(),
+                                               })
+                                       } else {
+                                               config.data.datasets[index].data.push(randomScalingFactor());
+                                       }
+                               }
+
+                               window.myLine.update();
+                               updateLegend();
+                       }
+               });
+
+               $('#removeDataset').click(function() {
+                       config.data.datasets.splice(0, 1);
+                       window.myLine.update();
+                       updateLegend();
+               });
+
+               $('#removeData').click(function() {
+                       config.data.labels.splice(-1, 1); // remove the label first
+
+                       config.data.datasets.forEach(function(dataset, datasetIndex) {
+                               dataset.data.pop();
+                       });
+
+                       window.myLine.update();
+                       updateLegend();
+               });
+       </script>
 </body>
 
 </html>
index a1c63127139bbdadfca95d132e872b79a58efece..a97e284e00e2429f75b7495ebb45ad34d1cce629 100644 (file)
                        var datasetCount = this.getBarCount();
 
                        var tickWidth = (function() {
-                               var min = xScale.getPixelForValue(null, 1) - xScale.getPixelForValue(null, 0);
+                               var min = xScale.getPixelForTick(1) - xScale.getPixelForTick(0);
                                for (var i = 2; i < this.getDataset().data.length; i++) {
-                                       min = Math.min(xScale.getPixelForValue(null, i) - xScale.getPixelForValue(null, i - 1), min);
+                                       min = Math.min(xScale.getPixelForTick(i) - xScale.getPixelForTick(i - 1), min);
                                }
                                return min;
                        }).call(this);
                        var barIndex = this.getBarIndex(datasetIndex);
 
                        var ruler = this.getRuler();
-                       var leftTick = xScale.getPixelForValue(null, index, barIndex, this.chart.isCombo);
+                       var leftTick = xScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);
                        leftTick -= this.chart.isCombo ? (ruler.tickWidth / 2) : 0;
 
                        if (xScale.options.stacked) {
index b7e47102b572664f310fc62ecd64551e9abac4ac..ed25a369418ddf3afa8f2dd6594383e86e4ea142 100644 (file)
                        }
                        // If it is in fact an object, dive in one more level
                        if (typeof(rawValue) === "object") {
-                               return getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);
+                               if (rawValue instanceof Date) {
+                                       return rawValue;
+                               } else {
+                                       return getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);
+                               }
                        }
 
                        // Value is good, return it
index 7c132d3066f3a09393ed9adef745e1702ccbf880..8c957beb0551c1d40cd69ffc0479ae76067dd8a8 100644 (file)
 
                                        if (helpers.isArray(unitDefinition.steps) && Math.ceil(this.tickRange / labelCapacity) < helpers.max(unitDefinition.steps)) {
                                                // Use one of the prefedined steps
-                                               for (var idx = 1; idx < unitDefinition.steps.length; ++idx) {
+                                               for (var idx = 0; idx < unitDefinition.steps.length; ++idx) {
                                                        if (unitDefinition.steps[idx] > Math.ceil(this.tickRange / labelCapacity)) {
-                                                               this.unitScale = unitDefinition.steps[idx - 1];
+                                                               this.unitScale = unitDefinition.steps[idx];
                                                                break;
                                                        }
                                                }
                                label = this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
                        }
 
+                       // Format nicely
+                       if (this.options.time.tooltipFormat) {
+                               label = this.parseTime(label).format(this.options.time.tooltipFormat);
+                       }
+
                        return label;
                },
                convertTicksToLabels: function() {
                        this.ticks = this.ticks.map(function(tick, index, ticks) {
-                               var formattedTick = tick.format(this.options.time.displayFormat ? this.options.time.displayFormat : this.options.time.displayFormats[this.tickUnit]);
+                               var formattedTick = tick.format(this.displayFormat);
 
                                if (this.options.ticks.userCallback) {
                                        return this.options.ticks.userCallback(formattedTick, index, ticks);
 
                                return this.left + Math.round(valueOffset);
                        } else {
-                               //return this.top + (decimal * (this.height / this.ticks.length));
                                var innerHeight = this.height - (this.paddingTop + this.paddingBottom);
                                var valueHeight = innerHeight / Math.max(this.ticks.length - 1, 1);
                                var heightOffset = (innerHeight * decimal) + this.paddingTop;
index a8a6c1a27b5a502c260baff8eecc3f0d16b1fe8d..c67b92908edc7ae15a005ab3b5f4ab941f39f4d0 100644 (file)
@@ -92,7 +92,35 @@ describe('Time scale tests', function() {
                scale.update(400, 50);
 
                // Counts down because the lines are drawn top to bottom
-               expect(scale.ticks).toEqual(['Jan 1, 2015', 'Jan 2, 2015', 'Jan 3, 2015', 'Jan 4, 2015', 'Jan 5, 2015', 'Jan 6, 2015', 'Jan 7, 2015', 'Jan 8, 2015', 'Jan 9, 2015', 'Jan 10, 2015', 'Jan 11, 2015']);
+               expect(scale.ticks).toEqual(['Jan 1, 2015', 'Jan 3, 2015', 'Jan 5, 2015', 'Jan 7, 2015', 'Jan 9, 2015', 'Jan 11, 2015']);
+       });
+
+       it('should build ticks using date objects', function() {
+               // Helper to build date objects
+               function newDateFromRef(days) {
+                       return moment('01/01/2015 12:00', 'DD/MM/YYYY HH:mm').add(days, 'd').toDate();
+               }
+
+               var scaleID = 'myScale';
+               var mockData = {
+                       labels: [newDateFromRef(0), newDateFromRef(1), newDateFromRef(2), newDateFromRef(4), newDateFromRef(6), newDateFromRef(7), newDateFromRef(9)], // days
+               };
+
+               var mockContext = window.createMockContext();
+               var Constructor = Chart.scaleService.getScaleConstructor('time');
+               var scale = new Constructor({
+                       ctx: mockContext,
+                       options: Chart.scaleService.getScaleDefaults('time'), // use default config for scale
+                       chart: {
+                               data: mockData
+                       },
+                       id: scaleID
+               });
+
+               scale.update(400, 50);
+
+               // Counts down because the lines are drawn top to bottom
+               expect(scale.ticks).toEqual(['Jan 1, 2015', 'Jan 3, 2015', 'Jan 5, 2015', 'Jan 7, 2015', 'Jan 9, 2015', 'Jan 11, 2015', 'Jan 13, 2015']);
        });
 
        it('should build ticks using the config unit', function() {