diff options
Diffstat (limited to 'public/js/mv')
-rw-r--r-- | public/js/mv/chart.js | 44 | ||||
-rw-r--r-- | public/js/mv/connect.js | 26 |
2 files changed, 56 insertions, 14 deletions
diff --git a/public/js/mv/chart.js b/public/js/mv/chart.js index d2eedd4..ebb62da 100644 --- a/public/js/mv/chart.js +++ b/public/js/mv/chart.js @@ -14,6 +14,21 @@ var mv = function(mv) { .xUnits(d3.time.hours) .xAxisPadding(2) ; + mv.charts.date.filterCompare = function(l, r) { + return ((l instanceof Date) ? l : new Date(l)) + == ((r instanceof Date) ? r : new Date(r)); + }; + // Remember the old date filter + // FIXME: Find a more elegant way to do this + var innerDateFilter = mv.charts.date.filter; + mv.charts.date.filter = function(_) { + if (!arguments.length) return innerDateFilter(); + if (!_) return innerDateFilter(_); + _ = _ instanceof Array + ? _.map(function(d) { return d instanceof Date ? d : new Date(d); }) + : (_ instanceof Date ? _ : new Date(_)); + return innerDateFilter(_); + } /* dc's default date format is M/D/Y, which is confusing and not ISO 8901 */ dc.dateFormat = d3.time.format("%Y-%m-%d %H:%M"); mv.charts.blvl = bar(monoGroup(med(dc.barChart("#blvl-chart")), "blvl")) @@ -52,7 +67,34 @@ var mv = function(mv) { .title(function(d) { return "Map " + d.key + ":" + d.value.r; }) .renderTitle(true) ; - mv.charts.stats = trellisChart("#stat-chart", ["str", "agi", "vit", "dex", "int", "luk"].map(function(d) { mv.heap[d].name = d; return mv.heap[d]; })); + var attrs = ["str", "agi", "vit", "dex", "int", "luk"]; + mv.charts.stats = trellisChart("#stat-chart", attrs.map(function(d) { mv.heap[d].name = d; return mv.heap[d]; })); + mv.charts.stats.filterCompare = function(l, r) { + /* Compare each attribute in turn. FIXME: Duplicated code with connect.js */ + if (l == null && r == null) + return true; + if (l == null || r == null) + return false; + for (var key in attrs) { + var attr = attrs[key]; + if (attr in l && attr in r) { + if (l[attr] instanceof Array) { + /* Range filter */ + if (!(r[attr] instanceof Array) + || l[attr][0] != r[attr][0] + || l[attr][1] != r[attr][1]) { + return false; + } + } else if ((r[attr] instanceof Array) || l[attr] != r[attr]) { + /* Exact filter */ + return false; + } + } else if (attr in l || attr in r) { + return false; + } + } + return true; + } mv.charts.type.filter("KILLXP"); var killxpShown = true; var killxpCharts = d3.select("#killxp-charts"); diff --git a/public/js/mv/connect.js b/public/js/mv/connect.js index 6f3101f..a17febb 100644 --- a/public/js/mv/connect.js +++ b/public/js/mv/connect.js @@ -105,30 +105,30 @@ var mv = function(mv) { /* See if there's any difference - if there isn't, don't update. */ var change = false; var key; + function filterCompare(key, l, r) { + return ("filterCompare" in mv.charts[key]) ? mv.charts[key].filterCompare(l, r) : l == r; + } /* Check for keys in the filters to apply which are not in our charts. */ for (key in filters) { - if (key == "date") { - /* - * Special case! FIXME: Find a more elegant way to handle this - */ - filters[key][0] = new Date(filters[key][0]); - filters[key][1] = new Date(filters[key][1]); - } if (!(key in mv.charts)) continue; - var filter = mv.charts[key].filter(); - if (typeof(filter) == "array") { + /* The two filters to compare. */ + var l = mv.charts[key].filter(); + var r = filters[key]; + if (l instanceof Array) { /* Crossfilter uses arrays to filter ranges. Exactly the first two elements are significant. */ - if (filter[0] == filters[key][0] && - filter[1] == filters[key][1]) { + if ((r instanceof Array) + && filterCompare(key, l[0], r[0]) + && filterCompare(key, l[1], r[1])) { continue; } - } else if (filter == filters[key]) { + } else if (!(r instanceof Array) && filterCompare(key, l, r)) { + /* Exact filter */ continue; } /* This filter differs. Apply it. */ change = true; - mv.charts[key].filter(filters[key]); + mv.charts[key].filter(r); } /* Check for keys in our charts which are not in the filters to apply. */ for (key in mv.charts) { |