diff --git a/assets/javascripts/reporting/filters.js b/assets/javascripts/reporting/filters.js index fde9c93461..89cf41cded 100644 --- a/assets/javascripts/reporting/filters.js +++ b/assets/javascripts/reporting/filters.js @@ -131,7 +131,7 @@ Reporting.Filters = { }, visible_filters: function () { - return $("filter_table").childElements().first().select('tr').select(function (tr) { + return $("filter_table").select("tr").select(function (tr) { return tr.visible() === true; }).collect(function (filter) { return filter.getAttribute("data-filter-name"); @@ -148,26 +148,31 @@ Reporting.Filters = { // Afterwards, collect the visible filters from the dependents list and start // narrowing down their values. activate_dependents: function () { - var dependents = this.getAttribute("data-dependents").replace(/'/g, '"'); // [String] - var active_filters = Reporting.Filters.visible_filters(); // [String] + var dependents = this.getAttribute("data-dependents").replace(/'/g, '"').evalJSON(); + var active_filters = Reporting.Filters.visible_filters(); if (!active_filters.include(dependents.first())) { - $("add_filter_select").select("option[value='" + dependents.first() + "']").first().selected = true; - Reporting.Filters.add_filter($("add_filter_select")); + Reporting.Filters.show_filter(dependents.first(), { slowly: true }); + active_filters.unshift(dependents.first()); } - var active_dependents = dependents.select(function (d) { - return active_filters.include(d); - }); var source = this.getAttribute("data-filter-name"); - Reporting.Filters.narrow_values([source], active_dependents); + setTimeout(function () { // Make sure the newly shown filters are in the DOM + var active_dependents = dependents.select(function (d) { + return active_filters.include(d); + }); + Reporting.Filters.narrow_values([source], active_dependents); + }, 1); }, // Narrow down the available values for the [dependents] of [sources]. // This will narrow down for each dependent separately, adding each finished // dependent to the sources array and removing it from the dependents array. narrow_values: function (sources, dependents) { + if (sources.size() === 0 || dependents.size === 0) { + return; + } var params = "?narrow_values=1&dependent=" + dependents.first(); - sources.inject(params, function (string, filter) { - return string + "&sources[]=" + filter; + sources.each(function (filter) { + params = params + "&sources[]=" + filter; }); var targetUrl = document.location.href + params; var updater = new Ajax.Request(targetUrl, @@ -176,15 +181,15 @@ Reporting.Filters = { evalScripts: true, postBody: Form.serialize('query_form'), onSuccess: function (response) { - if (response.isJSON()) { + if (response.responseJSON !== undefined) { var selectBox = $(dependents.first() + "_arg_1_val"); var selected = selectBox.select("option").collect(function (sel) { if (sel.selected) { return sel.value; } }).compact(); - var newOptions = response.evalJSON().inject("", function (str, o) { - return str + ''; + var newOptions = response.responseJSON.inject("", function (str, o) { + return str + ''; }); selectBox.innerHTML = newOptions; selected.each(function (val) { @@ -193,12 +198,9 @@ Reporting.Filters = { opt.first().selected = true; } }); - var newDependents = dependents.reverse(); - newDependents.pop(); - newDependents = newDependents.reverse(); - var newSources = sources; - newSources.push(dependents.first()); - Reporting.Filters.narrow_values(newSources, newDependents); + sources.push(dependents.first()); // Add as last element + dependents.splice(0, 1); // Delete first element + Reporting.Filters.narrow_values(sources, dependents); } } } diff --git a/lib/report/controller.rb b/lib/report/controller.rb index e315448f61..f6389ac03d 100644 --- a/lib/report/controller.rb +++ b/lib/report/controller.rb @@ -105,19 +105,19 @@ module Report::Controller # Determine the available values for the specified filter and return them as # json, if that was requested. This will be executed INSTEAD of the actual action def possibly_only_narrow_values - if params[:narrow_values] == 1 + if params[:narrow_values] == "1" sources = params[:sources] dependent = params[:dependent] - query = CostQuery.new + query = report_engine.new sources.each do |dependency| - query.filter(dependency, + query.filter(dependency.to_sym, :operator => params[:operators][dependency], :values => params[:values][dependency]) end query.column(dependent) - values = query.result.collect {|r| debugger; r.fields[dependent] } - render :text => values.to_json + values = query.result.collect {|r| r.fields[dependent] } + render :json => values.to_json end end