From 375c06aa785d46c1a388ed05f6beb8f3b50aeaaf Mon Sep 17 00:00:00 2001 From: David Schnur Date: Sat, 14 Jul 2012 21:31:53 -0400 Subject: [PATCH] Added an option to control legend sort order. Added a legend 'sorted' option that allows sorting of legend entries independent of series order. It accepts either null/false, true, 'ascending', 'descending' or a comparator function. --- jquery.flot.js | 57 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/jquery.flot.js b/jquery.flot.js index 3c089dd..8908bf7 100644 --- a/jquery.flot.js +++ b/jquery.flot.js @@ -51,7 +51,8 @@ position: "ne", // position of default legend container within plot margin: 5, // distance from grid edge to default legend container within plot backgroundColor: null, // null means auto-detect - backgroundOpacity: 0.85 // set to 0 to avoid background + backgroundOpacity: 0.85, // set to 0 to avoid background + sorted: null // default to no legend sorting }, xaxis: { show: null, // null = auto-detect, true = always, false = never @@ -2105,21 +2106,50 @@ c.normalize(); return c.toString(); } - + function insertLegend() { + placeholder.find(".legend").remove(); if (!options.legend.show) return; - - var fragments = [], rowStarted = false, + + var fragments = [], entries = [], rowStarted = false, lf = options.legend.labelFormatter, s, label; + + // Build a list of legend entries, with each having a label and a color + for (var i = 0; i < series.length; ++i) { s = series[i]; - label = s.label; - if (!label) - continue; - + if (s.label) { + entries.push({ + label: lf ? lf(s.label, s) : s.label, + color: s.color + }); + } + } + + // Sort the legend using either the default or a custom comparator + + if (options.legend.sorted) { + if ($.isFunction(options.legend.sorted)) { + entries.sort(options.legend.sorted); + } else { + var ascending = options.legend.sorted != "descending"; + entries.sort(function(a, b) { + return a.label == b.label ? 0 : ( + (a.label < b.label) != ascending ? 1 : -1 // Logical XOR + ); + }); + } + } + + // Generate markup for the list of entries, in their final order + + for (var i = 0; i < entries.length; ++i) { + + entry = entries[i]; + if (i % options.legend.noColumns == 0) { if (rowStarted) fragments.push(''); @@ -2127,16 +2157,15 @@ rowStarted = true; } - if (lf) - label = lf(label, s); - fragments.push( - '
' + - '' + label + ''); + '
' + + '' + entry.label + '' + ); } + if (rowStarted) fragments.push(''); - + if (fragments.length == 0) return;