diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2012-11-22 17:19:38 +0100 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2012-11-26 13:54:16 +0100 |
commit | b6fe0fa6e5af97a38224c53449c316dd1978d848 (patch) | |
tree | c6000117043c199428620bdcb77adccd5886d43e /sonar-server | |
parent | 0667155d25f0f9dc7ad838129aa7c9833f99d6e1 (diff) | |
download | sonarqube-b6fe0fa6e5af97a38224c53449c316dd1978d848.tar.gz sonarqube-b6fe0fa6e5af97a38224c53449c316dd1978d848.zip |
SONAR-3825 add more form attributes
Diffstat (limited to 'sonar-server')
7 files changed, 146 insertions, 54 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index 956d72cfb95..79d5345884f 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -43,6 +43,7 @@ import org.sonar.core.i18n.RuleI18nManager; import org.sonar.core.measure.MeasureFilterDecoder; import org.sonar.core.measure.MeasureFilterEngine; import org.sonar.core.measure.MeasureFilterExecutor; +import org.sonar.core.measure.MeasureFilterFactory; import org.sonar.core.metric.DefaultMetricFinder; import org.sonar.core.notification.DefaultNotificationManager; import org.sonar.core.persistence.DaoUtils; @@ -241,6 +242,7 @@ public final class Platform { servicesContainer.addSingleton(SettingsChangeNotifier.class); servicesContainer.addSingleton(PageDecorations.class); servicesContainer.addSingleton(MeasureFilterDecoder.class); + servicesContainer.addSingleton(MeasureFilterFactory.class); servicesContainer.addSingleton(MeasureFilterExecutor.class); servicesContainer.addSingleton(MeasureFilterEngine.class); servicesContainer.addSingleton(DryRunDatabaseFactory.class); diff --git a/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java b/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java index cbedd251521..e362cbb6bfb 100644 --- a/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java +++ b/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java @@ -102,7 +102,7 @@ public final class JRubyFacade { return get(MeasureFilterEngine.class).execute(json, userId); } - public List<MeasureFilterRow> executeMeasureFilter2(Map<String,String> map, @Nullable Long userId) throws ParseException { + public List<MeasureFilterRow> executeMeasureFilter2(Map<String,Object> map, @Nullable Long userId) throws ParseException { return get(MeasureFilterEngine.class).execute2(map, userId); } diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/favourites_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/favourites_controller.rb index ea8ebd54e8e..a529ac6d273 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/favourites_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/favourites_controller.rb @@ -30,7 +30,7 @@ class FavouritesController < ApplicationController else current_user.add_favourite(favourite_id) @style='fav' - @tooltip='Click to delete from favourites' + @tooltip='Click to remove from favourites' end star_id=params[:elt] @@ -40,7 +40,7 @@ class FavouritesController < ApplicationController page.element.addClassName(star_id, @style) page.element.writeAttribute(star_id, 'alt', @tooltip) page.element.writeAttribute(star_id, 'title', @tooltip) - end + end end end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb b/sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb new file mode 100644 index 00000000000..6d4beff64a9 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb @@ -0,0 +1,38 @@ +# +# Sonar, entreprise quality control tool. +# Copyright (C) 2008-2012 SonarSource +# mailto:contact AT sonarsource DOT com +# +# Sonar is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# Sonar is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with Sonar; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 +# +module MeasuresHelper + + def list_column_title(filter, column, url_params) + if column.sort? + html = link_to(h(column.display_name), url_params.merge({:controller => 'measures', :action => 'search', :asc => (!filter.sort_asc?).to_s, :sort => column.key})) + else + html=h(column.display_name) + end + #if column.variation + # html="<img src='#{ApplicationController.root_context}/images/trend-up.png'></img> #{html}" + #end + + if filter.sort_key==column.key + html << (filter.sort_asc? ? image_tag("asc12.png") : image_tag("desc12.png")) + end + "<th class='#{column.align}'>#{html}</th>" + end + +end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/measure_filter.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/measure_filter.rb index f8c4c8cc55d..fd71d2aa752 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/models/measure_filter.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/models/measure_filter.rb @@ -44,23 +44,17 @@ class MeasureFilter # Column to be displayed class Column - attr_reader :key + attr_reader :key, :metric def initialize(key) @key = key - end - - def metric - @metric ||= - begin - metric_key = @key.split(':')[1] - Metric.by_key(metric_key) if metric_key - end + metric_key = @key.split(':')[1] + @metric = Metric.by_key(metric_key) if metric_key end def display_name - if metric - Api::Utils.message("metric.#{metric.key}.name", :default => metric.short_name) + if @metric + Api::Utils.message("metric.#{@metric.key}.name", :default => @metric.short_name) else Api::Utils.message("filters.col.#{@key}", :default => @key) end @@ -146,7 +140,6 @@ class MeasureFilter user = options[:user] rows=Api::Utils.java_facade.executeMeasureFilter2(@criteria, (user ? user.id : nil)) snapshot_ids = filter_authorized_snapshot_ids(rows, controller) - snapshot_ids = paginate_snapshot_ids(snapshot_ids) init_data(snapshot_ids) self @@ -161,9 +154,7 @@ class MeasureFilter end def set_criteria_default_value(key, value) - if !@criteria.has_key?(key.to_sym) - set_criteria_value(key, value) - end + set_criteria_value(key, value) unless @criteria.has_key?(key.to_sym) end private @@ -193,12 +184,8 @@ class MeasureFilter authorized_project_ids = controller.select_authorized(:user, project_ids) snapshot_ids = rows.map { |row| row.getSnapshotId() if authorized_project_ids.include?(row.getResourceRootId()) }.compact @security_exclusions = (snapshot_ids.size<rows.size) - snapshot_ids - end - - def paginate_snapshot_ids(snapshot_ids) @pagination.count = snapshot_ids.size - snapshot_ids[@pagination.offset .. (@pagination.offset+@pagination.limit)] + snapshot_ids[@pagination.offset .. (@pagination.offset+@pagination.limit)] end def init_data(snapshot_ids) @@ -209,7 +196,11 @@ class MeasureFilter snapshots.each do |snapshot| data = Data.new(snapshot) data_by_snapshot_id[snapshot.id] = data - @data << data + end + + # @data must be in the same order than the snapshot ids + snapshot_ids.each do |sid| + @data << data_by_snapshot_id[sid] end metric_ids = @columns.map { |column| column.metric }.compact.uniq.map { |metric| metric.id } diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display_list.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display_list.html.erb index fd24b72fa60..15648dbf9e8 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display_list.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display_list.html.erb @@ -1,20 +1,21 @@ +<% + display_favourites = logged_in? + colspan = @filter.columns.size + colspan += 1 if display_favourites +%> <table class="data"> <thead> <tr> + <% if display_favourites %><th class="thin"></th><% end %> <% @filter.columns.each do |column| %> - <% if column.metric %> - <th class="right"><%= Api::Utils.message("metric.#{column.metric.key}.name", :default => column.metric.short_name) -%></th> - <% elsif column.key=='name' %> - <th class="left"><%= Api::Utils.message("filters.col.name") -%></th> - <% else %> - <th class="right"><%= Api::Utils.message("filters.col.#{column.key}", :default => column.key) -%></th> - <% end %> + <%= list_column_title(@filter, column, url_params) -%> <% end %> </tr> </thead> <tbody> <% @filter.data.each do |data| %> <tr class="<%= cycle 'even', 'odd' -%>"> + <% if display_favourites %><td class="thin"><%= link_to_favourite(data.snapshot.resource) -%></td><% end %> <% @filter.columns.each do |column| %> <% if column.metric %> <td class="right"> @@ -36,6 +37,11 @@ <% end %> </tr> <% end %> + <% if @filter.data.empty? %> + <tr class="even"> + <td colspan="<%= colspan -%>"><%= message 'no_data' -%></td> + </tr> + <% end %> </tbody> - <%= render :partial => 'utils/tfoot_pagination', :locals => {:pagination => @filter.pagination, :colspan => @filter.columns.size} %> + <%= render :partial => 'utils/tfoot_pagination', :locals => {:pagination => @filter.pagination, :colspan => colspan} %> </table>
\ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/measures/search.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/measures/search.html.erb index fd1fc74d54c..09750fc6be3 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/measures/search.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/measures/search.html.erb @@ -5,13 +5,22 @@ width: 240px; } + #filter-form select { + width: 200px; + padding: 1px; + } + + #filter-form select option { + padding: 1px 10px 1px 4px; + } + #filter-result { padding-left: 250px; } </style> <% end %> -<% url_options = params.reject { |k, v| v.empty? || k=='search' }.merge({:controller => 'measures', :action => 'search'}) %> +<% url_params = params.reject { |k, v| v.nil? || v=='' || k.starts_with?('_') }.merge({:controller => 'measures', :action => 'search'}) %> <div id="measure-filter"> <div id="filter-form"> @@ -19,37 +28,78 @@ <table> <tbody> <tr> - <td>Base:</td> - <td><input type="text" name="base"></td> + <td> + Base:<br> + <input type="text" name="base"> + </td> + </tr> + <tr> + <td> + Direct children:<br> + <%= check_box_tag 'onBaseChildren', 'true', params['onBaseChildren']=='true' -%> + </td> </tr> <tr> - <td>Qualifiers:</td> <td> - <select name="qualifiers"> - <option value="">Any</option> - <option value="TRK">Project</option> - <option value="TRK,BRC">Project</option> - <option value="DIR,PAC">Directory/Package</option> - <option value="FIL,CLA">File</option> - <option value="UTS">Unit Test File</option> + Qualifiers:<br> + <%= select_tag 'qualifiers[]', options_for_select([['Any', ''], ['Project', 'TRK'], ['Sub-project', 'BRC'], ['Directory/Package', 'DIR']], params['qualifiers']||''), :size => 5, :multiple => true -%> + </td> + </tr> + <tr> + <td> + Language:<br> + <select name="languages[]" multiple size="5"> + <option value="" <%= 'selected' if params['languages[]'].blank? -%>>Any</option> + <% Api::Utils.languages.each do |language| %> + <option value="<%= language.key.parameterize -%>"><%= h language.name -%></option> + <% end %> </select> </td> </tr> <tr> - <td>Language:</td> - <td><input type="text" name="language"></td> + <td> + Name:<br> + <input type="text" name="nameRegexp"></td> </tr> <tr> - <td>Name:</td> - <td><input type="text" name="nameRegexp"></td> + <td> + Key:<br> + <input type="text" name="keyRegexp"></td> </tr> <tr> - <td>Key:</td> - <td><input type="text" name="keyRegexp"></td> + <td> + Favourites only:<br> + <%= check_box_tag 'favourites', 'true', params['favourites']=='true' %> + </td> </tr> <tr> - <td><input type="submit" name="search" value="Search"></td> - <td></td> + <td> + From date:<br> + <input type="text" name="fromDate" value="<%= params['fromDate'] -%>"> + </td> + </tr> + <tr> + <td> + To date:<br> + <input type="text" name="toDate" value="<%= params['toDate'] -%>"> + </td> + </tr> + <tr> + <td> + Before:<br> + <input type="text" name="beforeDays" value="<%= params['beforeDays'] -%>" size="4"> days + </td> + </tr> + <tr> + <td>After:<br> + <input type="text" name="afterDays" value="<%= params['afterDays'] -%>" size="4"> days + </td> + </tr> + <tr> + <td> + <input type="submit" name="_search" value="Search"> + <a href="<%= ApplicationController.root_context -%>/measures">Reset</a> + </td> </tr> </tbody> </table> @@ -57,15 +107,20 @@ </div> <% if @filter %> <div id="filter-result"> + Display as: <% MeasureFilter::DISPLAYS.each do |display| %> - <%= link_to display.key, url_options.merge(:display => display.key) -%> + <%= link_to_if display.key!=@filter.display.key, display.key, url_params.merge(:display => display.key) -%> <% end %> - <%= render :partial => "measures/display_#{@filter.display.key}.html.erb" -%> + <%= render :partial => "measures/display_#{@filter.display.key}", :locals => {:url_params => url_params} -%> <p> - <% permalink = url_for(url_options) %> + <% permalink = url_for(url_params) %> <a href="<%= permalink -%>">Permalink</a>: <input type="text" value="<%= permalink -%>" size="100"> </p> + <% if @filter.security_exclusions %> + <p class="notes"><%= message('results_not_display_due_to_security') -%></p> + <% end %> + </div> <% end %> |