]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Add a function to filter items out of the legend
authoretimberg <evert.timberg@gmail.com>
Tue, 8 Nov 2016 02:46:31 +0000 (21:46 -0500)
committerEvert Timberg <evert.timberg+github@gmail.com>
Sat, 12 Nov 2016 23:48:25 +0000 (18:48 -0500)
docs/01-Chart-Configuration.md
src/core/core.legend.js
test/core.legend.tests.js

index a4692208892503b87b5edd8a84eb9e06c89fd4ab..571a20524716c8b8766deb13b4847a21a35d7236 100644 (file)
@@ -154,6 +154,7 @@ fontColor | Color | "#666" | Font color inherited from global configuration
 fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family inherited from global configuration
 padding | Number | 10 | Padding between rows of colored boxes
 generateLabels: | Function | `function(chart) {  }` | Generates legend items for each thing in the legend. Default implementation returns the text + styling for the color box. See [Legend Item](#chart-configuration-legend-item-interface) for details.
+filter | Function | null | Filters legend items out of the legend. Receives 2 parameters, a [Legend Item](#chart-configuration-legend-item-interface) and the chart data
 usePointStyle | Boolean | false | Label style will match corresponding point style (size is based on fontSize, boxWidth is not used in this case).
 
 #### Legend Item Interface
index 9ea5787db9df215b2ffa93da7c66030888d867d2..87426571b9710b69cdd3aec45b141e3e5a513591 100644 (file)
@@ -162,10 +162,20 @@ module.exports = function(Chart) {
                beforeBuildLabels: noop,
                buildLabels: function() {
                        var me = this;
-                       me.legendItems = me.options.labels.generateLabels.call(me, me.chart);
+                       var labelOpts = me.options.labels;
+                       var legendItems = labelOpts.generateLabels.call(me, me.chart);
+
+                       if (labelOpts.filter) {
+                               legendItems = legendItems.filter(function(item) {
+                                       return labelOpts.filter(item, me.chart.data);
+                               });
+                       }
+
                        if (me.options.reverse) {
-                               me.legendItems.reverse();
+                               legendItems.reverse();
                        }
+
+                       me.legendItems = legendItems;
                },
                afterBuildLabels: noop,
 
index 6d539fd1ec2233590a4b0235bdb4b183adfc89eb..3cdeddc903c5d7873733b29e04a73dabf8c425b5 100644 (file)
@@ -90,6 +90,71 @@ describe('Legend block tests', function() {
                }]);
        });
 
+       it('should filter items', function() {
+               var chart = window.acquireChart({
+                       type: 'bar',
+                       data: {
+                               datasets: [{
+                                       label: 'dataset1',
+                                       backgroundColor: '#f31',
+                                       borderCapStyle: 'butt',
+                                       borderDash: [2, 2],
+                                       borderDashOffset: 5.5,
+                                       data: []
+                               }, {
+                                       label: 'dataset2',
+                                       hidden: true,
+                                       borderJoinStyle: 'miter',
+                                       data: [],
+                                       legendHidden: true
+                               }, {
+                                       label: 'dataset3',
+                                       borderWidth: 10,
+                                       borderColor: 'green',
+                                       pointStyle: 'crossRot',
+                                       data: []
+                               }],
+                               labels: []
+                       },
+                       options: {
+                               legend: {
+                                       labels: {
+                                               filter: function(legendItem, data) {
+                                                       var dataset = data.datasets[legendItem.datasetIndex];
+                                                       return !dataset.legendHidden;
+                                               }
+                                       }
+                               }
+                       }
+               });
+
+               expect(chart.legend.legendItems).toEqual([{
+                       text: 'dataset1',
+                       fillStyle: '#f31',
+                       hidden: false,
+                       lineCap: 'butt',
+                       lineDash: [2, 2],
+                       lineDashOffset: 5.5,
+                       lineJoin: undefined,
+                       lineWidth: undefined,
+                       strokeStyle: undefined,
+                       pointStyle: undefined,
+                       datasetIndex: 0
+               }, {
+                       text: 'dataset3',
+                       fillStyle: undefined,
+                       hidden: false,
+                       lineCap: undefined,
+                       lineDash: undefined,
+                       lineDashOffset: undefined,
+                       lineJoin: undefined,
+                       lineWidth: 10,
+                       strokeStyle: 'green',
+                       pointStyle: 'crossRot',
+                       datasetIndex: 2
+               }]);
+       });
+
        it('should draw correctly', function() {
                var chart = window.acquireChart({
                        type: 'bar',