aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-server
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@gmail.com>2012-11-22 17:19:38 +0100
committerSimon Brandhof <simon.brandhof@gmail.com>2012-11-26 13:54:16 +0100
commitb6fe0fa6e5af97a38224c53449c316dd1978d848 (patch)
treec6000117043c199428620bdcb77adccd5886d43e /sonar-server
parent0667155d25f0f9dc7ad838129aa7c9833f99d6e1 (diff)
downloadsonarqube-b6fe0fa6e5af97a38224c53449c316dd1978d848.tar.gz
sonarqube-b6fe0fa6e5af97a38224c53449c316dd1978d848.zip
SONAR-3825 add more form attributes
Diffstat (limited to 'sonar-server')
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/Platform.java2
-rw-r--r--sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java2
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/controllers/favourites_controller.rb4
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb38
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/models/measure_filter.rb33
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display_list.html.erb22
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/measures/search.html.erb99
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 %>