]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3623 apply modal window to creation/restore Q profiles
authorSimon Brandhof <simon.brandhof@gmail.com>
Mon, 24 Sep 2012 20:02:27 +0000 (22:02 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Mon, 24 Sep 2012 20:06:23 +0000 (22:06 +0200)
plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties
sonar-server/src/main/webapp/WEB-INF/app/controllers/profiles_controller.rb
sonar-server/src/main/webapp/WEB-INF/app/models/api/utils.rb
sonar-server/src/main/webapp/WEB-INF/app/models/profile.rb
sonar-server/src/main/webapp/WEB-INF/app/views/profiles/_create_form.html.erb [new file with mode: 0644]
sonar-server/src/main/webapp/WEB-INF/app/views/profiles/_restore_form.html.erb [new file with mode: 0644]
sonar-server/src/main/webapp/WEB-INF/app/views/profiles/index.html.erb
sonar-server/src/main/webapp/stylesheets/style.css

index 228c8e39dea241a972e9b37912d6841bbf6e7c1f..abdbd4a4df6aea82c0fea3ebf04cc33745ca447c 100644 (file)
@@ -1147,10 +1147,10 @@ quality_profiles.compare_profiles=Compare profiles
 quality_profiles.restore_profile=Restore profile
 quality_profiles.x_language_profiles= {0} profiles
 quality_profiles.optional_configuration_file=Optional configuration file
-quality_profiles.create_x_language_profile=Create {0} profile
+quality_profiles.create_x_language_profile=Create {0} Profile
 quality_profiles.are_you_sure_want_x_profile_as_default=Are you sure that you want to set the profile "{0}" as default ?
 quality_profiles.profile_x_created=Profile "{0}" created. Set it as default or link it to a project to use it for next measures.
-quality_profiles.profile_x_already_exists=This profile already exists: {0}.
+quality_profiles.already_exists=This profile already exists.
 quality_profiles.please_type_profile_name=Please type a profile name.
 quality_profiles.delete_confirm_title=Delete Profile
 quality_profiles.profile_x_deleted=Profile "{0}" is deleted.
@@ -1159,7 +1159,6 @@ quality_profiles.profile_x_not_activated=Profile "{0}" is created but not activa
 quality_profiles.please_upload_backup_file=Please upload a backup file.
 quality_profiles.profile_x_associated_to_x_projects=Profile "{0}" associated to {1} projects.
 quality_profiles.profile_name_cant_be_blank=Profile name can not be blank.
-quality_profiles.profile_name_already_exists=This profile name already exists.
 quality_profiles.new_name=New name
 quality_profiles.name_for_new_profile=Name for the new profile
 quality_profiles.delete_confirm_title=Delete Profile
index 2e41cc0eab81ec610863985cbe664e514bbcbe34..308a84a491cad10c1f1ba3185c6bc0d9385ab1e4 100644 (file)
@@ -46,6 +46,13 @@ class ProfilesController < ApplicationController
   end
 
 
+  # GET /profiles/create_form?language=<language>
+  def create_form
+    language = params[:language]
+    bad_request 'Missing parameter: language' if language.blank?
+    profile = Profile.new(:language => language)
+    render :partial => 'profiles/create_form', :locals => {:language_key => language}
+  end
 
   #
   #
@@ -55,33 +62,25 @@ class ProfilesController < ApplicationController
   def create
     profile_name=params[:name]
     language=params[:language]
-    if profile_name.blank?|| language.blank?
-      flash[:warning]=message('quality_profiles.please_type_profile_name')
-    else
-      profile=Profile.find_by_name_and_language(profile_name, language)
-      if profile
-        flash[:error]=message('quality_profiles.profile_x_already_exists', :params => profile_name)
 
-      else
-        profile = Profile.create(:name => profile_name, :language => language, :default_profile => false, :enabled => true)
-        ok=profile.errors.empty?
-        if ok && params[:backup]
-          params[:backup].each_pair do |importer_key, file|
-            if !file.blank? && ok
-              messages = java_facade.importProfile(profile_name, language, importer_key, read_file_param(file))
-              flash_validation_messages(messages)
-              ok &= !messages.hasErrors()
-            end
-          end
-        end
-        if ok
-          flash[:notice]=message('quality_profiles.profile_x_created', :params => profile.name)
-        else
-          profile.reload
-          profile.destroy
+    profile = Profile.create(:name => profile_name, :language => language, :default_profile => false, :enabled => true)
+    ok = profile.errors.empty?
+    if ok && params[:backup]
+      params[:backup].each_pair do |importer_key, file|
+        if !file.blank? && ok
+          profile.import_configuration(importer_key, file)
+          ok &= profile.errors.empty?
         end
       end
     end
+
+    flash_profile(profile)
+    if ok
+      flash[:notice]=message('quality_profiles.profile_x_created', :params => profile.name)
+    elsif profile.id
+      Profile.destroy(profile.id)
+    end
+
     redirect_to :action => 'index'
   end
 
@@ -155,18 +154,17 @@ class ProfilesController < ApplicationController
   end
 
 
+  def restore_form
+    render :partial => 'profiles/restore_form'
+  end
 
-  #
-  #
   # POST /profiles/restore/<id>
-  #
-  #
   def restore
     if params[:backup].blank?
       flash[:warning]=message('quality_profiles.please_upload_backup_file')
     else
-      messages=java_facade.restoreProfile(read_file_param(params[:backup]), false)
-      flash_validation_messages(messages)
+      messages=java_facade.restoreProfile(Api::Utils.read_post_request_param(params[:backup]), false)
+      flash_messages(messages)
     end
     redirect_to :action => 'index'
   end
@@ -186,7 +184,7 @@ class ProfilesController < ApplicationController
       profile = Profile.find_by_name_and_language(CGI::unescape(params[:name]), language)
     end
     not_found('Profile not found') unless profile
-    
+
     if (params[:format].blank?)
       # standard sonar format
       result = java_facade.backupProfile(profile.id)
@@ -205,7 +203,7 @@ class ProfilesController < ApplicationController
   #
   def inheritance
     @profile = Profile.find(params[:id])
-    
+
     profiles=Profile.find(:all, :conditions => ['language=? and id<>? and (parent_name is null or parent_name<>?) and enabled=?', @profile.language, @profile.id, @profile.name, true], :order => 'name')
     @select_parent = [[message('none'), nil]] + profiles.collect{ |profile| [profile.name, profile.name] }
   end
@@ -256,7 +254,7 @@ class ProfilesController < ApplicationController
     else
       messages = java_facade.changeParentProfile(id, parent_name, current_user.name)
     end
-    flash_validation_messages(messages)
+    flash_messages(messages)
     redirect_to :action => 'inheritance', :id => id
   end
 
@@ -278,8 +276,8 @@ class ProfilesController < ApplicationController
   #
   def projects
     @profile = Profile.find(params[:id])
-    @available_projects=Project.find(:all, 
-      :include => ['profile','snapshots'], 
+    @available_projects=Project.find(:all,
+      :include => ['profile','snapshots'],
       :conditions => ['projects.qualifier=? AND projects.scope=? AND snapshots.islast=?', Project::QUALIFIER_PROJECT, Project::SCOPE_SET, true],
       :order => 'projects.name asc')
     @available_projects-=@profile.projects
@@ -326,7 +324,7 @@ class ProfilesController < ApplicationController
     else
       existing=Profile.find(:first, :conditions => {:name => name, :language => @profile.language, :enabled => true})
       if existing
-        @error=message('quality_profiles.profile_name_already_exists')
+        @error=message('quality_profiles.already_exists')
       elsif !@profile.provided?
         java_facade.renameProfile(@profile.id, name)
         success=true
@@ -351,7 +349,7 @@ class ProfilesController < ApplicationController
     if params[:id1].present? && params[:id2].present?
       @profile1 = Profile.find(params[:id1])
       @profile2 = Profile.find(params[:id2])
-      
+
       arules1 = ActiveRule.find(:all, :include => [{:active_rule_parameters => :rules_parameter}, :rule],
         :conditions => ['active_rules.profile_id=?', @profile1.id])
       arules2 = ActiveRule.find(:all, :order => 'rules.plugin_name, rules.plugin_rule_key', :include => [{:active_rule_parameters => :rules_parameter}, :rule],
@@ -385,7 +383,7 @@ class ProfilesController < ApplicationController
   DIFF_IN2=2
   DIFF_MODIFIED=3
   DIFF_SAME=4
-  
+
   private
 
   class RuleDiff
@@ -417,7 +415,7 @@ class ProfilesController < ApplicationController
                       end
                     else
                       @removed_params<<@arule1.parameter(param.name)
-                    end          
+                    end
                   elsif v2
                     @added_params<<@arule2.parameter(param.name)
                   end
@@ -435,7 +433,7 @@ class ProfilesController < ApplicationController
       rule.name()<=>other.rule.name
     end
   end
-  
+
   #
   # Remove active rules that are identical in both collections (same severity and same parameters)
   # and return a map with results {:added => X, :removed => Y, :modified => Z, 
@@ -497,19 +495,20 @@ class ProfilesController < ApplicationController
         rules[rule] = [active_rule1, active_rule2]
       end
     end while !arules1.empty? || !arules2.empty?
-    return {:same => same, :added => added, :removed => removed, :modified => modified,  :rules => rules}
+    return {:same => same, :added => added, :removed => removed, :modified => modified, :rules => rules}
   end
 
-  def read_file_param(configuration_file)
-    # configuration file is a StringIO
-    if configuration_file.respond_to?(:read)
-      return configuration_file.read
+  def flash_profile(profile)
+    # only 4 messages are kept each time to avoid cookie overflow.
+    if !profile.errors.empty?
+      flash[:error]=profile.errors.full_messages.to_a[0...4].join('<br/>')
+    end
+    if profile.warnings?
+      flash[:warning]=profile.warnings.full_messages.to_a[0...4].join('<br/>')
     end
-    # configuration file is not a readable object
-    nil
   end
 
-  def flash_validation_messages(messages)
+  def flash_messages(messages)
     # only 4 messages are kept each time to avoid cookie overflow.
     if messages.hasErrors()
       flash[:error]=messages.getErrors().to_a[0...4].join('<br/>')
index 1fe7ec88aa4f3fa52c4d458fd4c9f67eadca48cb..ddf214b88e2aa840ba4cddcae3568b3d506870bd 100644 (file)
@@ -165,4 +165,8 @@ class Api::Utils
       nil
     end
   end
+
+  def self.java_facade
+    Java::OrgSonarServerUi::JRubyFacade.getInstance()
+  end
 end
index 72d5ee07cd5a1260901c3b04038e8806958ec4a4..079645ff6c6b5ebf519e0a9e188a56706e6e3e1f 100644 (file)
@@ -24,25 +24,41 @@ class Profile < ActiveRecord::Base
   has_many :active_rules, :class_name => 'ActiveRule', :foreign_key => 'profile_id', :dependent => :destroy, :include => ['rule']
   has_many :projects, :order => 'name asc'
   has_many :active_rules_with_params, :class_name => 'ActiveRule', :foreign_key => 'profile_id',
-      :include => ['active_rule_parameters', 'active_rule_note']
+           :include => ['active_rule_parameters', 'active_rule_note']
+
+  validates_uniqueness_of :name, :scope => :language, :case_sensitive => false, :message => Api::Utils.message('quality_profiles.already_exists')
+  validates_presence_of :name, :message => Api::Utils.message('quality_profiles.please_type_profile_name')
+
+  # The warnings that are set on this record, equivalent to normal ActiveRecord errors but does not prevent
+  # the record from saving.
+  def warnings
+    @warnings ||= ActiveRecord::Errors.new(self)
+  end
+
+  def warnings?
+    not warnings.empty?
+  end
+
+  def notices
+    @notices ||= ActiveRecord::Errors.new(self)
+  end
+
+  def notices?
+    not notices.empty?
+  end
 
-  validates_uniqueness_of :name, :scope => :language, :case_sensitive => false
-  validates_presence_of :name
-  
-  DEFAULT_PROFILE_NAME = 'Sun checks'
-  
   def active?
     active
   end
-  
+
   def key
     "#{language}_#{name}"
   end
-  
+
   def provided?
     provided
   end
-  
+
   def validate_copy(name)
     new_rule_profile = Profile.new(:name => name, :provided => false, :default_profile => false, :language => language)
     new_rule_profile.valid?
@@ -90,6 +106,7 @@ class Profile < ActiveRecord::Base
   end
 
   @active_hash_by_rule_id=nil
+
   def active_hash_by_rule_id
     if @active_hash_by_rule_id.nil?
       @active_hash_by_rule_id={}
@@ -106,9 +123,9 @@ class Profile < ActiveRecord::Base
 
   def count_overriding_rules
     @count_overriding_rules||=
-      begin
-        active_rules.count(:conditions => ['inheritance=?', 'OVERRIDES'])
-      end
+        begin
+          active_rules.count(:conditions => ['inheritance=?', 'OVERRIDES'])
+        end
   end
 
   def inherited?
@@ -117,35 +134,48 @@ class Profile < ActiveRecord::Base
 
   def parent
     @parent||=
-      begin
-        if parent_name.present?
-          Profile.find(:first, :conditions => ['language=? and name=? and enabled=?', language, parent_name, true])
-        else
-          nil
+        begin
+          if parent_name.present?
+            Profile.find(:first, :conditions => ['language=? and name=? and enabled=?', language, parent_name, true])
+          else
+            nil
+          end
         end
-      end
   end
 
   def count_active_rules
-    active_rules.select{|ar| ar.rule.enabled}.size
+    active_rules.select { |ar| ar.rule.enabled }.size
   end
 
   def ancestors
     @ancestors ||=
-      begin
-        array=[]
-        if parent
-          array<<parent
-          array.concat(parent.ancestors)
+        begin
+          array=[]
+          if parent
+            array<<parent
+            array.concat(parent.ancestors)
+          end
+          array
         end
-        array
-      end
   end
 
   def children
     @children ||=
-      begin
-        Profile.find(:all, :conditions => ['language=? and parent_name=? and enabled=?', language, name, true], :order => 'name')
-      end
+        begin
+          Profile.find(:all, :conditions => ['language=? and parent_name=? and enabled=?', language, name, true], :order => 'name')
+        end
+  end
+
+  def import_configuration(importer_key, file)
+    messages = Api::Utils.java_facade.importProfile(name, language, importer_key, Api::Utils.read_post_request_param(file))
+    messages.getErrors().each do |msg|
+      errors.add_to_base msg
+    end
+    messages.getWarnings().each do |msg|
+      warnings.add_to_base msg
+    end
+    messages.getInfos().each do |msg|
+      notices.add_to_base msg
+    end
   end
 end
\ No newline at end of file
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/_create_form.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/_create_form.html.erb
new file mode 100644 (file)
index 0000000..f4e34e0
--- /dev/null
@@ -0,0 +1,37 @@
+<%
+   language=controller.java_facade.getLanguages().find { |l| l.getKey()==language_key }
+   importers=controller.java_facade.getProfileImportersForLanguage(language_key)
+%>
+<form id="create-profile-form" action="profiles/create" enctype="multipart/form-data" method="POST">
+  <fieldset>
+    <input type="hidden" name="language" value="<%= language_key -%>"/>
+
+    <div class="form-head">
+      <h2><%= h message('quality_profiles.create_x_language_profile', :params => language.getName()) -%></h2>
+    </div>
+
+    <div class="form-body">
+
+      <div class="form-field">
+        <label for="name"><%= message('name') -%> <em>*</em></label>
+        <input id="create-profile-name" name="name" type="text" size="50" maxlength="100"/>
+      </div>
+
+      <% importers.to_a.sort { |x, y| x.getName() <=> y.getName() }.each do |importer| %>
+        <div class="form-field">
+          <label for="backup[<%= importer.getKey() -%>]"><%= h importer.getName() -%></label>
+          <%= file_field_tag "backup[#{importer.getKey()}]" %>
+          <div class="form-field-description"><%= h message('quality_profiles.optional_configuration_file') -%></div>
+        </div>
+      <% end %>
+    </div>
+
+    <div class="form-foot">
+      <input type="submit" value="<%= h message('create') -%>" id="create-profile-submit"/>
+      <a href="#" onclick="return closeModalWindow()" id="create-profile-cancel"><%= h message('cancel') -%></a>
+    </div>
+  </fieldset>
+</form>
+<script>
+  $j('#create-profile-name').focus();
+</script>
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/_restore_form.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/profiles/_restore_form.html.erb
new file mode 100644 (file)
index 0000000..a2274ec
--- /dev/null
@@ -0,0 +1,22 @@
+<form id="restore-profile-form" action="profiles/restore" enctype="multipart/form-data" method="POST">
+  <fieldset>
+
+    <div class="form-head">
+      <h2><%= h message('quality_profiles.restore_profile') -%></h2>
+    </div>
+
+    <div class="form-body">
+
+      <div class="form-field">
+        <label for="name"><%= message('backup_verb') -%> <em>*</em></label>
+        <%= file_field_tag 'backup' %>
+      </div>
+
+    </div>
+
+    <div class="form-foot">
+      <input type="submit" value="<%= h message('quality_profiles.restore_profile') -%>" id="restore-profile-submit"/>
+      <a href="#" onclick="return closeModalWindow()" id="restore-profile-cancel"><%= h message('cancel') -%></a>
+    </div>
+  </fieldset>
+</form>
\ No newline at end of file
index c193a57642ffa6a82eddd5443a1c8fe4afc445fd..59f703807f119c39d02e9a21c0e73867539831d1 100644 (file)
@@ -3,79 +3,31 @@
     <ul style="float: right" class="operations">
       <li>
         <%= image_tag 'compare.png' -%>
-        <a href="<%= ApplicationController.root_context -%>/profiles/compare" id="compare-link"><%= message('quality_profiles.compare_profiles') -%></a>
+        <a href="profiles/compare" id="compare-link"><%= message('quality_profiles.compare_profiles') -%></a>
       </li>
       <li class="last">
         <%= image_tag 'restore.gif' -%>
-        <a href="#" onclick="$('restore-form').show();return false;" id="restore-link"><%= message('quality_profiles.restore_profile') -%></a>
+        <a href="profiles/restore_form" class="open-modal" id="restore-link"><%= message('quality_profiles.restore_profile') -%></a>
       </li>
     </ul>
   <% end %>
   <h1 class="marginbottom10"><%= message('quality_profiles.page') -%></h1>
 </div>
 
-<% if administrator? %>
-  <form class="admin marginbottom10" id="restore-form" action="<%= url_for :action => 'restore' -%>" enctype="multipart/form-data" style="display: none" method="post">
-    <table class="spaced width100">
-      <tr>
-        <td width="1%" nowrap><%= message('backup_verb') -%>:</td>
-        <td><%= file_field_tag 'backup' %></td>
-      </tr>
-
-      <tr>
-        <td colspan="2">
-          <input type="submit" value="<%= message('quality_profiles.restore_profile') -%>"/>
-          <a href="#" onclick="$('restore-form').reset();$('restore-form').hide();return false;"><%= message('cancel') -%></a>
-        </td>
-      </tr>
-    </table>
-  </form>
-<% end %>
-
-
 <%
    languages.sort { |x, y| x.getName() <=> y.getName() }.each do |language|
-     importers=controller.java_facade.getProfileImportersForLanguage(language.getKey())
 %>
   <div class="line-block">
     <% if administrator? %>
       <ul style="float: right" class="horizontal">
         <li class="marginleft10 add">
-          <a href="#" onClick="$('create-form-<%= language.getKey() -%>').show();$('create-form-<%= language.getKey() -%>-name').focus();return false;" id="create-link-<%= language.getKey() -%>"><%= message('create') -%></a>
-        </li>
+          <a id="create-link-<%= language.getKey() -%>" href="profiles/create_form?language=<%= language.getKey() -%>" class="open-modal"><%= message('create') -%></a>
+      </li>
       </ul>
     <% end %>
     <h2><%= message('quality_profiles.x_language_profiles', :params => language.getName()) -%></h2>
   </div>
 
-  <% if administrator? %>
-    <form class="admin" id="create-form-<%= language.getKey() -%>" action="<%= url_for :action => 'create' -%>" style="display: none" enctype="multipart/form-data" method="post">
-      <input type="hidden" name="language" value="<%= language.getKey() -%>"/>
-      <table class="spaced width100">
-        <tr>
-          <td width="1%" nowrap><%= message('name') -%>:</td>
-          <td><input type="text" name="name" id="create-form-<%= language.getKey() -%>-name"/></td>
-        </tr>
-        <% importers.to_a.sort { |x, y| x.getName() <=> y.getName() }.each do |importer| %>
-          <tr>
-            <td width="1%" nowrap><%= importer.getName() -%>:</td>
-            <td>
-              <%= file_field_tag "backup[#{importer.getKey()}]" %>
-              <span class="note"><%= message('quality_profiles.optional_configuration_file') -%></span>
-            </td>
-          </tr>
-        <% end %>
-
-        <tr>
-          <td colspan="2">
-            <input type="submit" value="<%= message('quality_profiles.create_x_language_profile', :params => language.getName()) -%>" id="create-submit-<%= language.getKey() -%>"/>
-            <a href="#" onclick="$('create-form-<%= language.getKey()-%>').reset();$('create-form-<%= language.getKey()-%>').hide();return false;"><%= message('cancel') -%></a>
-          </td>
-        </tr>
-      </table>
-    </form>
-  <% end %>
-
   <table class="data width100" id="profiles_<%= language.getKey() -%>">
     <thead>
     <tr>
index eb256ea622d5aaae59e76f44d259608e74eab110..dabef843723d7c384af9fad7286adc19d30a6c4e 100644 (file)
@@ -2398,7 +2398,7 @@ select.medium-width {
 
 .form-field-description {
   clear: both;
-  font-size: 11px;
+  font-size: 93%;
   color: #777;
 }