]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3825 support the parameter "baseId"
authorSimon Brandhof <simon.brandhof@gmail.com>
Thu, 29 Nov 2012 14:33:01 +0000 (15:33 +0100)
committerSimon Brandhof <simon.brandhof@gmail.com>
Thu, 29 Nov 2012 17:59:33 +0000 (18:59 +0100)
17 files changed:
plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties
sonar-core/src/main/java/org/sonar/core/measure/MeasureFilter.java
sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterCondition.java
sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterDecoder.java
sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterExecutor.java
sonar-core/src/main/java/org/sonar/core/measure/MeasureFilterFactory.java
sonar-core/src/main/java/org/sonar/core/resource/ResourceDao.java
sonar-core/src/main/java/org/sonar/core/resource/ResourceMapper.java
sonar-core/src/main/resources/org/sonar/core/resource/ResourceMapper.xml
sonar-core/src/test/java/org/sonar/core/measure/MeasureFilterExecutorTest.java
sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/models/measure_filter.rb
sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display_list.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/measures/_filters.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/measures/search.html.erb
sonar-server/src/main/webapp/WEB-INF/db/migrate/357_move_existing_measure_filters.rb
sonar-server/src/main/webapp/stylesheets/layout.css

index f1c80cad45aa38f0589a107ffab327243a2c9bc1..fad4634ba8fc5ab2b7486d7bea77c74d2d2925f9 100644 (file)
@@ -392,7 +392,7 @@ measure_filter.col.key=Key
 measure_filter.col.language=Language
 measure_filter.col.links=Links
 measure_filter.col.name=Name
-measure_filter.col.short_name=Name
+measure_filter.col.short_name=Short Name
 measure_filter.col.version=Version
 measure_filter.missing_name=Name is missing
 measure_filter.name_too_long=Name is too long
@@ -403,6 +403,9 @@ measure_filter.remove_from_system=Remove from system
 measure_filter.add_to_system=Add to system
 measure_filter.title_shared_filters=Shared Filters
 measure_filter.title_system_filters=System Filters
+measure_filter.key_like=Key like
+measure_filter.name_contains=Name contains
+measure_filter.only_favourites=Favourites only
 
 #------------------------------------------------------------------------------
 #
index cbe358cb792ea20342c2f9dfcb43cae9c99ca5ce..4145203540bbe24246ff443d4a4bf8d75b7b96e4 100644 (file)
@@ -36,7 +36,11 @@ public class MeasureFilter {
 
   // conditions on resources
   private String baseResourceKey;
-  private boolean onBaseResourceChildren = false; // only if getBaseResourceKey is set
+  private Long baseResourceId;
+
+  // only if baseResourceKey or baseResourceId are set
+  private boolean onBaseResourceChildren = false;
+
   private List<String> resourceScopes = Collections.emptyList();
   private List<String> resourceQualifiers = Collections.emptyList();
   private List<String> resourceLanguages = Collections.emptyList();
@@ -60,6 +64,15 @@ public class MeasureFilter {
     return this;
   }
 
+  public Long getBaseResourceId() {
+    return baseResourceId;
+  }
+
+  public MeasureFilter setBaseResourceId(Long i) {
+    this.baseResourceId = i;
+    return this;
+  }
+
   public MeasureFilter setOnBaseResourceChildren(boolean b) {
     this.onBaseResourceChildren = b;
     return this;
index f991b2f270f6f1cc5851aa0da5137748b0235b5a..2485c905583e7f80e7899961263c5cda8bfb45c9 100644 (file)
@@ -24,13 +24,50 @@ import org.apache.commons.lang.builder.ToStringStyle;
 import org.sonar.api.measures.Metric;
 
 public class MeasureFilterCondition {
+  public enum Operator {
+    EQUALS("eq", "="), GREATER("gt", ">"), GREATER_OR_EQUALS("gte", ">="), LESS("lt", "<"), LESS_OR_EQUALS("lte", "<=");
+
+    private String code;
+    private String sql;
+
+    private Operator(String code, String sql) {
+      this.code = code;
+      this.sql = sql;
+    }
+
+    public String getCode() {
+      return code;
+    }
+
+    public String getSql() {
+      return sql;
+    }
+
+    public static Operator fromCode(String code) {
+      for (Operator operator : values()) {
+        if (operator.code.equals(code)) {
+          return operator;
+        }
+      }
+      throw new IllegalArgumentException("Unknown operator code: " + code);
+    }
+
+    public static Operator fromSql(String sql) {
+      for (Operator operator : values()) {
+        if (operator.sql.equals(sql)) {
+          return operator;
+        }
+      }
+      throw new IllegalArgumentException("Unknown operator sql: " + sql);
+    }
+  }
 
   private final Metric metric;
-  private final String operator;
+  private final Operator operator;
   private final double value;
   private Integer period = null;
 
-  public MeasureFilterCondition(Metric metric, String operator, double value) {
+  public MeasureFilterCondition(Metric metric, Operator operator, double value) {
     this.metric = metric;
     this.operator = operator;
     this.value = value;
@@ -45,7 +82,7 @@ public class MeasureFilterCondition {
     return metric;
   }
 
-  public String operator() {
+  public Operator operator() {
     return operator;
   }
 
@@ -67,7 +104,7 @@ public class MeasureFilterCondition {
   void appendSqlCondition(StringBuilder sql) {
     sql.append(" pm.metric_id=");
     sql.append(metric.getId());
-    sql.append(" AND ").append(valueColumn()).append(operator).append(value);
+    sql.append(" AND ").append(valueColumn()).append(operator.getSql()).append(value);
   }
 
   @Override
index c1871be38deed8b5f0d32aca8ed0cf5c907ff627..eed8ded2246ed264f46e178e37f8a5ec165f3cad 100644 (file)
@@ -106,7 +106,7 @@ public class MeasureFilterDecoder implements ServerComponent {
         Metric metric = metricFinder.findByKey((String) c.get("metric"));
         String operator = (String) c.get("op");
         Double value = (Double) c.get("val");
-        MeasureFilterCondition condition = new MeasureFilterCondition(metric, operator, value);
+        MeasureFilterCondition condition = new MeasureFilterCondition(metric, MeasureFilterCondition.Operator.fromSql(operator), value);
         if (c.containsKey("period")) {
           condition.setPeriod(((Long) c.get("period")).intValue());
         }
index 0de8fad5f27764c99796f7da27da6120e1c80e34..64179399792e6d819ffe7aeec05d8d2f632c6067 100644 (file)
@@ -72,11 +72,14 @@ public class MeasureFilterExecutor implements ServerComponent {
   private void prepareContext(MeasureFilterContext context, MeasureFilter filter, SqlSession session) {
     if (filter.getBaseResourceKey() != null) {
       context.setBaseSnapshot(resourceDao.getLastSnapshot(filter.getBaseResourceKey(), session));
+    } else if (filter.getBaseResourceId() != null) {
+      context.setBaseSnapshot(resourceDao.getLastSnapshotByResourceId(filter.getBaseResourceId(), session));
     }
   }
 
   static boolean isValid(MeasureFilter filter, MeasureFilterContext context) {
     boolean valid = (Strings.isNullOrEmpty(filter.getBaseResourceKey()) || context.getBaseSnapshot()!=null);
+    valid &= (filter.getBaseResourceId()==null || context.getBaseSnapshot()!=null);
     valid &= !(filter.isOnBaseResourceChildren() && context.getBaseSnapshot() == null);
     valid &= !(filter.isOnFavourites() && context.getUserId() == null);
     valid &= validateMeasureConditions(filter);
index bff48d90249b7ee5db1fd7d3dcd59418bd8f51ab..e951420881c4d6b7aefcc24609372c91bc431df1 100644 (file)
@@ -45,6 +45,9 @@ public class MeasureFilterFactory implements ServerComponent {
   public MeasureFilter create(Map<String, Object> properties) {
     MeasureFilter filter = new MeasureFilter();
     filter.setBaseResourceKey((String) properties.get("base"));
+    if (properties.containsKey("baseId")) {
+      filter.setBaseResourceId(Long.valueOf((String) properties.get("baseId")));
+    }
     filter.setResourceScopes(toList(properties.get("scopes")));
     filter.setResourceQualifiers(toList(properties.get("qualifiers")));
     filter.setResourceLanguages(toList(properties.get("languages")));
@@ -92,13 +95,14 @@ public class MeasureFilterFactory implements ServerComponent {
 
   private MeasureFilterCondition toCondition(Map<String, Object> props, int index) {
     MeasureFilterCondition condition = null;
-    String metricKey = (String) props.get("c" + index + "metric");
-    String op = (String) props.get("c" + index + "op");
-    String val = (String) props.get("c" + index + "val");
+    String metricKey = (String) props.get("c" + index + "_metric");
+    String op = (String) props.get("c" + index + "_op");
+    String val = (String) props.get("c" + index + "_val");
     if (!Strings.isNullOrEmpty(metricKey) && !Strings.isNullOrEmpty(op) && !Strings.isNullOrEmpty(val)) {
       Metric metric = metricFinder.findByKey(metricKey);
-      condition = new MeasureFilterCondition(metric, op, Double.parseDouble(val));
-      String period = (String) props.get("c" + index + "period");
+      MeasureFilterCondition.Operator operator = MeasureFilterCondition.Operator.fromCode(op);
+      condition = new MeasureFilterCondition(metric, operator, Double.parseDouble(val));
+      String period = (String) props.get("c" + index + "_period");
       if (period != null) {
         condition.setPeriod(Integer.parseInt(period));
       }
index 1b6a4e1398fbf5d933de4a3cbf61cc6dce1b77ec..b8a7c88e5469c4d6fb24b5c95f22fdf9300c23c3 100644 (file)
@@ -77,9 +77,13 @@ public class ResourceDao {
   }
 
   public SnapshotDto getLastSnapshot(String resourceKey, SqlSession session) {
-    return session.getMapper(ResourceMapper.class).selectLastSnapshotByKey(resourceKey);
+    return session.getMapper(ResourceMapper.class).selectLastSnapshotByResourceKey(resourceKey);
   }
 
+  public SnapshotDto getLastSnapshotByResourceId(long resourceId, SqlSession session) {
+      return session.getMapper(ResourceMapper.class).selectLastSnapshotByResourceId(resourceId);
+    }
+
   public List<ResourceDto> getDescendantProjects(long projectId) {
     SqlSession session = mybatis.openSession();
     try {
index 05b8ba5d53d260865fa69139623e86b739f1912e..68ac9a3af59207f07a8dfd7e3dc6cf2bd219e1a7 100644 (file)
@@ -26,7 +26,9 @@ import java.util.List;
 public interface ResourceMapper {
   SnapshotDto selectSnapshot(Long snapshotId);
 
-  SnapshotDto selectLastSnapshotByKey(String resourceKey);
+  SnapshotDto selectLastSnapshotByResourceKey(String resourceKey);
+
+  SnapshotDto selectLastSnapshotByResourceId(long resourceId);
 
   ResourceDto selectResource(long id);
 
index 0cc52cbbdf8053c9ca29fb03d4da846d9753ac85..044da26c78f30d6b216a44e6db29f2f34d9e93ac 100644 (file)
     select s.* from snapshots s, projects p where p.kee=#{id} and p.enabled=${_true} and p.copy_resource_id is null and s.islast=${_true} and p.id=s.project_id
   </select>
 
+  <select id="selectLastSnapshotByResourceId" parameterType="string" resultMap="snapshotResultMap">
+      select s.* from snapshots s where s.project_id=#{id} and s.islast=${_true}
+    </select>
+
   <select id="selectDescendantProjects" parameterType="long" resultMap="resourceResultMap">
     select * from projects where scope='PRJ' and root_id=#{id}
   </select>
index d71a364c23867a4cae48f79ccabe5c02073231dc..a755be6cdbe81d2f07b9a5f3a0bcec4fa7fd3507 100644 (file)
@@ -75,7 +75,7 @@ public class MeasureFilterExecutorTest extends AbstractDaoTestCase {
   @Test
   public void filter_is_not_valid_if_condition_on_unknown_metric() {
     MeasureFilterContext context = new MeasureFilterContext();
-    MeasureFilter filter = new MeasureFilter().addCondition(new MeasureFilterCondition(null, "<", 3.0));
+    MeasureFilter filter = new MeasureFilter().addCondition(new MeasureFilterCondition(null, MeasureFilterCondition.Operator.LESS, 3.0));
     assertThat(MeasureFilterExecutor.isValid(filter, context)).isFalse();
   }
 
@@ -263,7 +263,7 @@ public class MeasureFilterExecutorTest extends AbstractDaoTestCase {
   public void condition_on_numeric_measure() throws SQLException {
     MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("CLA"))
       .setSortOnMetric(METRIC_LINES)
-      .addCondition(new MeasureFilterCondition(METRIC_LINES, ">", 200));
+      .addCondition(new MeasureFilterCondition(METRIC_LINES, MeasureFilterCondition.Operator.GREATER, 200));
     List<MeasureFilterRow> rows = executor.execute(filter, new MeasureFilterContext());
 
     assertThat(rows).hasSize(1);
@@ -274,7 +274,7 @@ public class MeasureFilterExecutorTest extends AbstractDaoTestCase {
   public void condition_on_measure_variation() throws SQLException {
     MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("TRK"))
       .setSortOnMetric(METRIC_LINES)
-      .addCondition(new MeasureFilterCondition(METRIC_LINES, ">", 1000).setPeriod(5));
+      .addCondition(new MeasureFilterCondition(METRIC_LINES, MeasureFilterCondition.Operator.GREATER, 1000).setPeriod(5));
     List<MeasureFilterRow> rows = executor.execute(filter, new MeasureFilterContext());
 
     assertThat(rows).hasSize(1);
@@ -285,8 +285,8 @@ public class MeasureFilterExecutorTest extends AbstractDaoTestCase {
   public void multiple_conditions_on_numeric_measures() throws SQLException {
     MeasureFilter filter = new MeasureFilter().setResourceQualifiers(Arrays.asList("CLA"))
       .setSortOnMetric(METRIC_LINES)
-      .addCondition(new MeasureFilterCondition(METRIC_LINES, ">", 2))
-      .addCondition(new MeasureFilterCondition(METRIC_LINES, "<=", 50));
+      .addCondition(new MeasureFilterCondition(METRIC_LINES, MeasureFilterCondition.Operator.GREATER, 2))
+      .addCondition(new MeasureFilterCondition(METRIC_LINES, MeasureFilterCondition.Operator.LESS_OR_EQUALS, 50));
     List<MeasureFilterRow> rows = executor.execute(filter, new MeasureFilterContext());
 
     assertThat(rows).hasSize(1);
index bb3202ce1c055f246330398c59068bc6cd4c8c47..9898d17773dcd4f034d9812c78e2796b49c15571 100644 (file)
@@ -56,7 +56,7 @@ module MeasuresHelper
     elsif column.key=='version'
       h result.snapshot.version
     elsif column.key=='language'
-      h result.snapshot.resource.language
+      Api::Utils.language_name(result.snapshot.resource.language)
     elsif column.key=='links' && result.links
       html = ''
       result.links.select { |link| link.href.start_with?('http') }.each do |link|
index 9ea3e4fe2a0d946d9cf6ac6cbed7ff25c91ac56a..9095a567eecf7793c2103b26d6bde220faccb548 100644 (file)
@@ -170,6 +170,14 @@ class MeasureFilter < ActiveRecord::Base
     criteria.merge({'id' => self.id})
   end
 
+  def base_resource
+    if criteria('base')
+      Project.find(:first, :conditions => ['kee=? and copy_resource_id is null and person_id is null', criteria('base')])
+    elsif criteria('baseId')
+      Project.find(criteria('baseId'))
+    end
+  end
+
   private
 
   def init_results
@@ -233,8 +241,8 @@ class MeasureFilter < ActiveRecord::Base
         end
       end
     end
-    if criteria['base'].present?
-      base_snapshot = Snapshot.find(:first, :include => 'project', :conditions => ['projects.kee=? and islast=?', criteria['base'], true])
+    if base_resource
+      base_snapshot = base_resource.last_snapshot
       if base_snapshot
         @base_result = Result.new(base_snapshot)
         unless metric_ids.empty?
index 322041be554ec3ad76004c4cb5581e34993f280a..01010c6562e5e43310ecf27104f2f289edfdd5be 100644 (file)
@@ -2,11 +2,14 @@
    display_favourites = logged_in?
    colspan = @filter.display.columns.size
    colspan += 1 if display_favourites
+   table_columns = []
+   table_columns << '' if display_favourites
+   table_columns.concat(@filter.display.columns.map{|c| c.key})
    if edit_mode
      content_for :script do
 %>
     <script>
-      var cols = [<%= @filter.display.columns.map{|c| "'#{c.key}'"}.join(',')-%>];
+      var cols = [<%= table_columns.map{|col| "'#{col}'"}.join(',')-%>];
       function leftCol(id) {
         var cell = $j('#measures-table tr.admin td[index=' + id + ']');
         var columnIndex = cell.parent().children().index(cell);
           var tr = $j(this);
           var td1 = tr.find('th:eq(' + from + ')');
           var td2 = tr.find('th:eq(' + to + ')');
-          td1.detach().insertAfter(td2);
+          td1.remove().insertAfter(td2);
         });
         $j('#measures-table tbody tr').each(function () {
           var tr = $j(this);
           var td1 = tr.find('td:eq(' + from + ')');
           var td2 = tr.find('td:eq(' + to + ')');
-          td1.detach().insertAfter(td2);
+          td1.remove().insertAfter(td2);
         });
       }
       function deleteCol(id) {
         $j('#measures-table thead tr').each(function () {
           var tr = $j(this);
           var td1 = tr.find('th:eq(' + columnIndex + ')');
-          td1.detach();
+          td1.remove();
         });
         $j('#measures-table tbody tr').each(function () {
           var tr = $j(this);
           var td1 = tr.find('td:eq(' + columnIndex + ')');
-          td1.detach();
+          td1.remove();
         });
       }
     </script>
@@ -67,7 +70,7 @@
                               :html_id => 'select-metric',
                               :allow_empty => true,
                               :key_prefix => 'metric:',
-                              :extra_values => [['Name', 'name'], ['Short Name', 'short_name'], ['Description', 'description'], ['Version', 'version']] -%>
+                              :extra_values => [[message('measure_filter.col.name'), 'name'], [message('measure_filter.col.short_name'), 'short_name'], [message('measure_filter.col.description'), 'description'], [message('measure_filter.col.language'), 'language'], [message('measure_filter.col.version'), 'version']] -%>
         <select id="select-period" style="display: none;">
           <option value="">Value</option>
           <% period_names.each_with_index do |period_name, index| %>
       }
       cols.push(columnKey);
       window.location = removeUrlAttr(decodeURI(window.location.href), 'cols\\[\\]') + '&' + $j.map(cols,function (a) {
-        return 'cols[]=' + a;
+        return a ? 'cols[]=' + a : null;
       }).join('&');
     });
     $j("#exit-edit").on("click", function (e) {
       var url = removeUrlAttr(decodeURI(window.location.href), 'cols\\[\\]');
       url = removeUrlAttr(url, 'edit');
       url += '&' + $j.map(cols,function (a) {
-        return 'cols[]=' + a;
+        return a ? 'cols[]=' + a : null;
       }).join('&');
       window.location = url;
     });
   <% if edit_mode %>
     <tr class="admin">
       <% if display_favourites %>
-        <th></th>
+        <td></td>
       <% end %>
       <% @filter.display.columns.each_with_index do |column, index| %>
         <td class="<%= column.align -%>" index="<%= index -%>">
index ecc200a09f3e3c43f48f0b1dc6c96b21130576ae..6a4e4523a7f7558082c355fe8c8b9fda224060a0 100644 (file)
@@ -10,6 +10,7 @@
 
 <% if logged_in? %>
   <br/>
+  <div class="h2">My Favourites</div>
   <ul id="fav-filters">
     <% current_user.favourited_measure_filters.each do |filter| %>
       <li>
@@ -17,5 +18,6 @@
       </li>
     <% end %>
   </ul>
+  <br>
   <a href="<%= ApplicationController.root_context -%>/measures/manage" class="link-action">Manage</a>
 <% end %>
index 870e0f8ab9c2966f6ac1b83532e492eaacc9577b..92dfe690edd9514d3b1a146a3653b2ceb6bda276 100644 (file)
@@ -52,7 +52,7 @@
           $j('#filters').show();
           if (!filtersLoaded) {
             $j('#filters').load(baseUrl + '/measures/filters');
-            filtersLoaded=true;
+            filtersLoaded = true;
           }
         });
       }
@@ -90,7 +90,7 @@
         <tr>
           <td class="width100">
             Base:<br>
-            <input type="text" name="base" value="<%= @filter.criteria['base'] -%>" class="large-input">
+            <%= resource_select_tag 'baseId', :resource_type_property => 'supportsGlobalDashboards', :width => '100%', :selected_resource => @filter.base_resource -%>
           </td>
         </tr>
         <tr>
         </tr>
         <tr>
           <td class="width100">
-            Name:<br>
+            <%= message('measure_filter.name_contains') -%>:<br>
             <input type="text" name="nameRegexp" value="<%= h @filter.criteria['nameRegexp'] -%>" class="large-input"></td>
         </tr>
         <tr>
           <td class="width100">
-            Key:<br>
+            <%= message('measure_filter.key_like') -%>:<br>
             <input type="text" name="keyRegexp" value="<%= h @filter.criteria['keyRegexp'] -%>" class="large-input"></td>
         </tr>
         <tr>
           <td>
-            Favourites only:<br>
+            <%= message 'measure_filter.only_favourites' %>:<br>
             <%= check_box_tag 'onFavourites', 'true', @filter.criteria['onFavourites']=='true' -%>
           </td>
         </tr>
+
+        <% condition_metrics = Metric.all.select { |m| m.numeric? } %>
+        <tr>
+          <td>
+            <br>
+            <%= metric_select_tag 'c1_metric', condition_metrics, :allow_empty => true, :selected_key => @filter.criteria('c1_metric'), :width => '180px' -%>
+            <%= select_tag 'c1_period', options_for_select([['Value', ''], ['Period 1', '1'], ['Period 2', '2'], ['Period 3', '3']], @filter.criteria('c1_period')) -%>
+            <%= select_tag 'c1_op', options_for_select([['Equals', 'eq'], ['Less than', 'lt'], ['Less or equals', 'lte'], ['Greater than', 'gt'], ['Greater or equals', 'gte']], @filter.criteria('c1_op')) -%>
+            <input type="text" size="5" name="c1_val" value="<%= h @filter.criteria('c1_val') -%>">
+            <br><br>
+          </td>
+        </tr>
+
+        <tr>
+          <td>
+            <br>
+            <%= metric_select_tag 'c2_metric', condition_metrics, :allow_empty => true, :selected_key => @filter.criteria('c2_metric'), :width => '180px' -%>
+            <%= select_tag 'c2_period', options_for_select([['Value', ''], ['Period 1', '1'], ['Period 2', '2'], ['Period 3', '3']], @filter.criteria('c2_period')) -%>
+            <%= select_tag 'c2_op', options_for_select([['Equals', 'eq'], ['Less than', 'lt'], ['Less or equals', 'lte'], ['Greater than', 'gt'], ['Greater or equals', 'gte']], @filter.criteria('c2_op')) -%>
+            <input type="text" size="5" name="c2_val" value="<%= h @filter.criteria('c2_val') -%>">
+            <br><br>
+          </td>
+        </tr>
+
         <tr>
           <td>
             From date:<br>
   </div>
 
   <% if @filter.results && @filter.display %>
-    <div id="filter-result" class="page-split-right width100">
+    <div id="filter-result" class="page-split-right">
+
       <% if @filter.name %>
         <p>
           <span class="h3"><%= h @filter.name -%></span>
             - <span><%= h @filter.description -%></span>
           <% end %>
         </p>
-
       <% end %>
 
       <%
          edit_mode = (params[:edit]=='true')
          unless edit_mode
       %>
-        Display as:
-        <% MeasureFilterDisplay.keys.each do |display_key| %>
-          <%= link_to_if display_key!=@filter.display.key, display_key, params.merge(:action => 'search', :display => display_key, :id => @filter.id) -%>
-        <% end %>
-        <a id="edit" href="<%= url_for params.merge({:edit => true, :id => @filter.id}) -%>" class="button"><%= message('configure') -%></a>
-        <% if logged_in? %>
-          <% if @filter.id==nil || @filter.user_id==current_user.id %>
-            <a id="save" href="<%= url_for params.merge({:action => 'save_form', :id => @filter.id}) -%>" class="button open-modal"><%= message('save') -%></a>
-          <% end %>
-          <a id="copy" href="<%= url_for params.merge({:action => 'copy_form', :id => @filter.id}) -%>" class="button open-modal"><%= message('copy') -%></a>
-        <% end %>
+        <table class="width100">
+          <tr>
+            <td class="left">
+              Display as:
+              <% MeasureFilterDisplay.keys.each do |display_key| %>
+                <%= link_to_if display_key!=@filter.display.key, display_key, params.merge(:action => 'search', :display => display_key, :id => @filter.id) -%>
+              <% end %>
+            <td class="right">
+              <a id="edit" href="<%= url_for params.merge({:edit => true, :id => @filter.id}) -%>" class="button"><%= message('configure') -%></a>
+              <% if logged_in? %>
+                <% if @filter.id==nil || @filter.user_id==current_user.id %>
+                  <a id="save" href="<%= url_for params.merge({:action => 'save_form', :id => @filter.id}) -%>" class="button open-modal"><%= message('save') -%></a>
+                <% end %>
+                <% if @filter.id %>
+                  <a id="copy" href="<%= url_for params.merge({:action => 'copy_form', :id => @filter.id}) -%>" class="button open-modal"><%= message('copy') -%></a>
+                <% end %>
+              <% end %>
+              </tr>
+        </table>
       <% end %>
-      <%= render :partial => "measures/display_#{@filter.display.class::KEY}", :locals => {:edit_mode => edit_mode} -%>
-      <br>
-
       <% if @filter.security_exclusions %>
         <p class="notes"><%= message('results_not_display_due_to_security') -%></p>
       <% end %>
-
+      <%= render :partial => "measures/display_#{@filter.display.class::KEY}", :locals => {:edit_mode => edit_mode} -%>
     </div>
   <% end %>
 
index a1a5b1b8f535f62f3792cd5fe875c55c532103b6..ca5b45c4422fd70891195e5464ee6fbc532f6ff3 100644 (file)
@@ -61,11 +61,9 @@ class MoveExistingMeasureFilters < ActiveRecord::Migration
     new_filter.shared = (old_filter.shared || old_filter.user_id.nil?)
     data = []
     data << 'onFavourites=true' if old_filter.favourites
-    if old_filter.resource_id
-      resource = Project.find(:first, :conditions => {:id => old_filter.id})
-      data << "base=#{resource.kee}" if resource
-    end
+    data << "baseId=#{old_filter.resource_id}" if old_filter.resource_id
     data << "pageSize=#{old_filter.page_size}" if old_filter.page_size
+    data << "display=#{old_filter.default_value || 'list'}"
 
     columns = []
     asc = nil
index bbfe1cd935c31972161b9805bb95b68f5d648ac1..caebd92a378b5918e449cca16ff7b68eab65f8a6 100644 (file)
@@ -319,4 +319,5 @@ body, a {
   display: table-cell;
   margin: 0;
   vertical-align: top;
+  width: 100%;
 }
\ No newline at end of file