]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5851 replace old profiles page with new one
authorStas Vilchik <vilchiks@gmail.com>
Mon, 13 Apr 2015 07:56:02 +0000 (09:56 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Mon, 13 Apr 2015 11:36:12 +0000 (13:36 +0200)
43 files changed:
server/sonar-web/src/main/hbs/nav/nav-global-navbar.hbs
server/sonar-web/src/main/js/quality-profiles/app.js
server/sonar-web/src/main/webapp/WEB-INF/app/controllers/old_profiles_controller.rb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/controllers/profiles_controller.rb
server/sonar-web/src/main/webapp/WEB-INF/app/controllers/quality_profiles_controller.rb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_copy_form.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_create_form.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_diff_rule.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_new.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_rename_form.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_restore_built_in_form.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_restore_form.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_tabs.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/changelog.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/compare.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/edit.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/index.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/inheritance.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/new.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/permalinks.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/projects.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/show.html.erb [new file with mode: 0644]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_copy_form.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_create_form.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_diff_rule.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_new.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_rename_form.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_restore_built_in_form.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_restore_form.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_tabs.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/changelog.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/compare.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/edit.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/index.html.erb
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/inheritance.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/new.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/permalinks.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/projects.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/show.html.erb [deleted file]
server/sonar-web/src/main/webapp/WEB-INF/app/views/quality_profiles/index.html.erb [deleted file]
server/sonar-web/src/test/js/quality-profiles.js
server/sonar-web/src/test/views/profiles.jade [new file with mode: 0644]
server/sonar-web/src/test/views/quality_profiles.jade [deleted file]

index d3821e0922d60665bf5ad51f9abe87a659f549bb..5ca0d9d843f522c62107c7a2808d630421b743fc 100644 (file)
@@ -41,8 +41,8 @@
     <li {{#isActiveLink '/profiles'}}class="active"{{/isActiveLink}}>
       <a href="{{link '/profiles'}}">{{t 'quality_profiles.page'}}</a>
     </li>
-    <li {{#isActiveLink '/quality_profiles'}}class="active"{{/isActiveLink}}>
-      <a href="{{link '/quality_profiles'}}">NEW {{t 'quality_profiles.page'}}</a>
+    <li {{#isActiveLink '/old_profiles'}}class="active"{{/isActiveLink}}>
+      <a href="{{link '/old_profiles'}}">OLD {{t 'quality_profiles.page'}}</a>
     </li>
     <li {{#isActiveLink '/quality_gates'}}class="active"{{/isActiveLink}}>
       <a href="{{link '/quality_gates'}}">{{t 'quality_gates.page'}}</a>
index 8cf66d6bf156dd066b549e16ce0428051252b18a..b3e2a269ea665ae13f41ba9678432dbdae7b8f5b 100644 (file)
@@ -67,7 +67,7 @@ require([
   });
 
   function getRoot () {
-    var QUALITY_PROFILES = '/quality_profiles',
+    var QUALITY_PROFILES = '/profiles',
         path = window.location.pathname,
         pos = path.indexOf(QUALITY_PROFILES);
     return path.substr(0, pos + QUALITY_PROFILES.length);
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/old_profiles_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/old_profiles_controller.rb
new file mode 100644 (file)
index 0000000..39c71ea
--- /dev/null
@@ -0,0 +1,574 @@
+#
+# SonarQube, open source software quality management tool.
+# Copyright (C) 2008-2014 SonarSource
+# mailto:contact AT sonarsource DOT com
+#
+# SonarQube 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.
+#
+# SonarQube 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 this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+class OldProfilesController < ApplicationController
+
+  helper :profiles
+
+  SECTION=Navigation::SECTION_QUALITY_PROFILES
+
+  def self.root_breadcrumb
+    {:name => Api::Utils.message('quality_profiles.page'), :url => {:controller => 'old_profiles', :action => 'index'}}
+  end
+
+  # GET /profiles/index
+  def index
+    add_breadcrumbs OldProfilesController::root_breadcrumb
+    call_backend do
+      @profiles = Internal.quality_profiles.allProfiles().to_a
+      @active_rule_counts = Internal.qprofile_loader.countAllActiveRules()
+    end
+    Api::Utils.insensitive_sort!(@profiles) { |profile| profile.name() }
+  end
+
+  # GET /profiles/show?key=<key>
+  def show
+    require_parameters 'key'
+    call_backend do
+      @profile = Internal.qprofile_loader.getByKey(params[:key])
+      if @profile
+        @deprecated_active_rules = Internal.qprofile_loader.countDeprecatedActiveRulesByProfile(@profile.getKey())
+        @stats = Internal.qprofile_loader.getStatsByProfile(@profile.getKey())
+        set_profile_breadcrumbs
+      else
+        # SONAR-5630
+        flash[:error] = message('quality_profiles.deleted_profile', :params => params[:key])
+        redirect_to :controller => 'old_profiles', :action => 'index'
+      end
+    end
+  end
+
+  # GET /profiles/create_form?language=<language>
+  def create_form
+    require_parameters 'language'
+    render :partial => 'old_profiles/create_form', :locals => {:language_key => params[:language]}
+  end
+
+  # POST /profiles/create?name=<profile name>&language=<language>&[backup=<file>]
+  def create
+    verify_post_request
+    call_backend do
+      files_by_key = {}
+      if params[:backup]
+        params[:backup].each_pair do |importer_key, file|
+          unless file.blank?
+            files_by_key[importer_key] = Api::Utils.read_post_request_param(file)
+          end
+        end
+      end
+      profile_name = Java::OrgSonarServerQualityprofile::QProfileName.new(params[:language], params[:name])
+      result = Internal.qprofile_service.create(profile_name, files_by_key)
+      flash[:notice] = message('quality_profiles.profile_x_created', :params => result.profile().getName())
+      flash_result(result)
+    end
+    redirect_to :action => 'index'
+  end
+
+  # Modal window to restore built-in profiles
+  # GET /profiles/restore_built_in_form/<profile id>
+  def restore_built_in_form
+    verify_ajax_request
+    require_parameters 'language'
+    @language = java_facade.getLanguages().find { |l| l.getKey()==params[:language].to_s }
+    call_backend do
+      @builtin_profile_names = Internal.qprofile_service.builtInProfileNamesForLanguage(params[:language].to_s)
+    end
+    render :partial => 'old_profiles/restore_built_in_form'
+  end
+
+  # POST /profiles/restore_built_in?language=<language>
+  def restore_built_in
+    verify_post_request
+    require_parameters 'language'
+    call_backend do
+      Internal.qprofile_service.restoreBuiltInProfilesForLanguage(params[:language].to_s)
+    end
+    redirect_to :action => 'index'
+  end
+
+  # POST /profiles/delete/<id>
+  def delete
+    verify_post_request
+    require_parameters 'id'
+
+    profile_key = profile_id_to_key(params[:id].to_i)
+    call_backend do
+      Internal.qprofile_service.delete(profile_key)
+    end
+
+    redirect_to(:controller => 'old_profiles', :action => 'index')
+  end
+
+
+  # POST /profiles/set_as_default/<id>
+  def set_as_default
+    verify_post_request
+    require_parameters 'id'
+
+    profile_key = profile_id_to_key(params[:id].to_i)
+    call_backend do
+      Internal.qprofile_service.setDefault(profile_key)
+    end
+    redirect_to :action => 'index'
+  end
+
+
+  # GET /profiles/copy_form/<profile id>
+  def copy_form
+    require_parameters 'id'
+
+    profile_id = params[:id].to_i
+    call_backend do
+      @profile = Internal.quality_profiles.profile(profile_id)
+    end
+    not_found('Profile not found') unless @profile
+
+    render :partial => 'old_profiles/copy_form'
+  end
+
+  # POST /profiles/copy/<id>?name=<name of new profile>[&overwrite=<name of overwritten profile>]
+  def copy
+    verify_post_request
+    verify_ajax_request
+    require_parameters 'id'
+
+    source_id = params[:id].to_i
+    source_profile = Internal.quality_profiles.profile(source_id)
+
+    source_key=profile_id_to_key(source_id)
+    target_name = params['name']
+
+    overwrite = (params['overwrite'] == target_name)
+    target_profile = nil
+
+    unless overwrite
+      target_profile = Internal.quality_profiles.profile(target_name, source_profile.language())
+    end
+
+    if target_profile.nil? || overwrite
+      call_backend do
+        Internal.qprofile_service.copyToName(source_key, target_name)
+        if overwrite
+          flash[:notice] = message('quality_profiles.copy_x_overwritten', :params => target_name)
+        else
+          flash[:notice] = message('quality_profiles.profile_x_not_activated', :params => target_name)
+        end
+        render :text => 'ok', :status => 200
+      end
+    else
+      render :text => message('quality_profiles.copy_overwrite_x', :params => target_name), :status => 409
+    end
+  end
+
+  # the backup action is allow to non-admin users : see http://jira.codehaus.org/browse/SONAR-2039
+  def backup
+    verify_post_request
+    require_parameters 'key'
+
+    profile_key=params[:key]
+    call_backend do
+      xml = Internal.qprofile_service.backup(profile_key)
+      send_data(xml, :type => 'text/xml', :disposition => "attachment; filename=#{profile_key}.xml")
+    end
+  end
+
+
+  # Modal window to restore profile backup
+  # GET /profiles/restore_form/<profile id>
+  def restore_form
+    verify_ajax_request
+    render :partial => 'old_profiles/restore_form'
+  end
+
+  # POST /profiles/restore?backup=<file>
+  def restore
+    if params[:backup].blank?
+      flash[:warning] = message('quality_profiles.please_upload_backup_file')
+    else
+      call_backend do
+        xml=Api::Utils.read_post_request_param(params[:backup])
+        Internal.qprofile_service.restore(xml)
+      end
+    end
+    redirect_to :action => 'index'
+  end
+
+
+  # GET /profiles/export?name=<profile name>&language=<language>&format<exporter key>
+  def export
+    language = params[:language]
+    if params[:name].blank?
+      profile = Internal.qprofile_service.getDefault(language)
+    else
+      profile = Internal.qprofile_loader.getByLangAndName(language, CGI::unescape(params[:name]))
+    end
+    not_found('Profile not found') unless profile
+
+    if params[:format].blank?
+      # standard sonar format
+      result = Internal.qprofile_service.backup(profile.getKee())
+      send_data(result, :type => 'text/xml', :disposition => 'inline')
+    else
+      exporter_key = params[:format]
+      result = Internal.qprofile_exporters.export(profile.getKee(), exporter_key)
+      send_data(result, :type => Internal.qprofile_exporters.mimeType(exporter_key), :disposition => 'inline')
+    end
+  end
+
+  # GET /profiles/inheritance?id=<profile id>
+  def inheritance
+    require_parameters 'id'
+
+    call_backend do
+      @profile = Internal.quality_profiles.profile(params[:id].to_i)
+      not_found('Profile not found') unless @profile
+      @parent = Internal.quality_profiles.parent(@profile) if @profile.parent
+      @ancestors = Internal.quality_profiles.ancestors(@profile).to_a
+      @children = Internal.quality_profiles.children(@profile).to_a
+      profiles = Internal.quality_profiles.profilesByLanguage(@profile.language()).to_a.reject { |p| p.id == @profile.id() || p.parent() == @profile.name() }
+      profiles = Api::Utils.insensitive_sort(profiles) { |p| p.name() }
+      @select_parent = [[message('none'), nil]] + profiles.collect { |profile| [profile.name(), profile.id()] }
+
+      @all_profile_stats = Internal.qprofile_loader.getAllProfileStats()
+    end
+
+    set_profile_breadcrumbs
+  end
+
+  # POST /profiles/change_parent?id=<profile id>&parent_id=<parent id>
+  def change_parent
+    verify_post_request
+    access_denied unless has_role?(:profileadmin)
+    require_parameters 'id'
+
+    profile_key = profile_id_to_key(params[:id].to_i)
+    parent_key = profile_id_to_key(params[:parent_id].to_i) unless params[:parent_id].empty?
+    call_backend do
+      Internal.qprofile_service.setParent(profile_key, parent_key)
+    end
+    redirect_to :action => 'inheritance', :id => params[:id]
+  end
+
+  # GET /profiles/changelog?key=<profile key>
+  def changelog
+    require_parameters 'key'
+
+    @profile = Internal.qprofile_loader.getByKey(params[:key])
+    not_found('Quality profile does not exist') unless @profile
+    search = {'profileKey' => @profile.key().to_s, 'since' => params[:since], 'to' => params[:to], 'p' => params[:p]}
+    result = Internal.component(Java::OrgSonarServerActivity::RubyQProfileActivityService.java_class).search(search)
+    @changes = result.activities
+    @paging = result.paging
+
+    set_profile_breadcrumbs
+  end
+
+  #
+  #
+  # GET /profiles/permalinks?id=<profile id>
+  #
+  #
+  def permalinks
+    require_parameters 'id'
+    @profile = Internal.quality_profiles.profile(params[:id].to_i)
+    not_found('Profile not found') unless @profile
+    set_profile_breadcrumbs
+  end
+
+
+  #
+  #
+  # GET /profiles/projects/<id>
+  #
+  #
+  def projects
+    require_parameters 'id'
+
+    call_backend do
+      @profile = Internal.quality_profiles.profile(params[:id].to_i)
+      not_found('Profile not found') unless @profile
+      projects = Internal.quality_profiles.projects(params[:id].to_i)
+      @projects = Api::Utils.insensitive_sort(projects.to_a) { |p| p.name }
+      set_profile_breadcrumbs
+    end
+  end
+
+
+  # POST /profiles/add_project?id=<profile id>&project=<project id>
+  def add_project
+    verify_post_request
+    require_parameters 'id', 'project'
+
+    project_id = Api::Utils.project_id(params[:project])
+    profile_id = params[:id].to_i
+
+    call_backend do
+      Internal.quality_profiles.addProject(profile_id, project_id.to_i)
+    end
+    redirect_to :action => 'projects', :id => profile_id
+  end
+
+  # POST /profiles/remove_project?id=<profile id>&project=<project id>
+  def remove_project
+    verify_post_request
+    require_parameters 'id', 'project'
+
+    profile_id = params[:id].to_i
+    call_backend do
+      Internal.quality_profiles.removeProject(profile_id, params[:project].to_i)
+    end
+    redirect_to :action => 'projects', :id => profile_id
+  end
+
+  # POST /profiles/remove_projects?id=<profile id>
+  def remove_projects
+    verify_post_request
+    require_parameters 'id'
+
+    profile_id = params[:id].to_i
+    call_backend do
+      Internal.quality_profiles.removeAllProjects(profile_id)
+    end
+    redirect_to :action => 'projects', :id => profile_id
+  end
+
+  # GET /profiles/rename_form?id=<id>
+  def rename_form
+    require_parameters 'id'
+    call_backend do
+      @profile = Internal.quality_profiles.profile(params[:id].to_i)
+      not_found('Profile not found') unless @profile
+    end
+    render :partial => 'old_profiles/rename_form'
+  end
+
+  # POST /profiles/rename?id=<id>&name=<new name>
+  def rename
+    verify_post_request
+    verify_ajax_request
+    require_parameters 'id'
+
+    call_backend do
+      profile_key = profile_id_to_key(params[:id].to_i)
+      Internal.qprofile_service.rename(profile_key, params[:new_name])
+    end
+    render :text => 'ok', :status => 200
+  end
+
+  # GET /profiles/compare?id1=<profile1 id>&id2=<profile2 id>
+  def compare
+    @profiles = Profile.all(:order => 'language asc, name')
+    id1 = params[:id1]
+    id2 = params[:id2]
+    if id1.present? && id2.present? && id1.respond_to?(:to_i) && id2.respond_to?(:to_i)
+      @id1 = params[:id1].to_i
+      @id2 = params[:id2].to_i
+      @profile1 = Profile.find(id1)
+      @profile2 = Profile.find(id2)
+
+      arules1 = ActiveRule.all(:include => [{:active_rule_parameters => :rules_parameter}, :rule],
+                               :conditions => ['active_rules.profile_id=?', @profile1.id])
+      arules2 = ActiveRule.all(:order => 'rules.plugin_name, rules.plugin_rule_key', :include => [{:active_rule_parameters => :rules_parameter}, :rule],
+                               :conditions => ['active_rules.profile_id=?', @profile2.id])
+
+      arules1.reject! { |arule| arule.rule.removed? }
+      arules2.reject! { |arule| arule.rule.removed? }
+
+      diffs_by_rule={}
+      arules1.each do |arule1|
+        diffs_by_rule[arule1.rule]||=RuleDiff.new(arule1.rule)
+        diffs_by_rule[arule1.rule].arule1=arule1
+      end
+      arules2.each do |arule2|
+        diffs_by_rule[arule2.rule]||=RuleDiff.new(arule2.rule)
+        diffs_by_rule[arule2.rule].arule2=arule2
+      end
+      @in1=[]
+      @in2=[]
+      @modified=[]
+      @sames=[]
+      diffs_by_rule.values.sort.each do |diff|
+        case diff.status
+          when DIFF_IN1 then
+            @in1<<diff
+          when DIFF_IN2 then
+            @in2<<diff
+          when DIFF_MODIFIED then
+            @modified<<diff
+          when DIFF_SAME then
+            @sames<<diff
+        end
+      end
+    end
+    add_breadcrumbs OldProfilesController::root_breadcrumb, Api::Utils.message('compare')
+  end
+
+  DIFF_IN1=1
+  DIFF_IN2=2
+  DIFF_MODIFIED=3
+  DIFF_SAME=4
+
+  private
+
+  class RuleDiff
+    attr_reader :rule, :removed_params, :added_params
+    attr_accessor :arule1, :arule2
+
+    def initialize(rule)
+      @rule=rule
+    end
+
+    def status
+      @status ||=
+          begin
+            if @arule1.nil?
+              @status=(@arule2 ? DIFF_IN2 : nil)
+            else
+              if @arule2
+                # compare severity and parameters
+                @removed_params=[]
+                @added_params=[]
+                @rule.parameters.each do |param|
+                  v1=@arule1.value(param.id)
+                  v2=@arule2.value(param.id)
+                  if v1
+                    if v2
+                      if v1!=v2
+                        @removed_params<<@arule1.parameter(param.name)
+                        @added_params<<@arule2.parameter(param.name)
+                      end
+                    else
+                      @removed_params<<@arule1.parameter(param.name)
+                    end
+                  elsif v2
+                    @added_params<<@arule2.parameter(param.name)
+                  end
+                end
+                diff=(@arule1.priority!=@arule2.priority) || !@removed_params.empty? || !@added_params.empty?
+                @status=(diff ? DIFF_MODIFIED : DIFF_SAME)
+              else
+                @status=DIFF_IN1
+              end
+            end
+          end
+    end
+
+    def <=>(other)
+      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,
+  # :rules => {rule1 => [activeruleleft1, activeruleright1], rule2 => [activeruleleft2, nil], ...]}
+  # Assume both collections are ordered by rule key
+  #
+  def compute_diff(arules1, arules2)
+    rules = {}
+    removed = 0
+    added = 0
+    modified = 0
+    same = 0
+    begin
+      diff = false
+      #take first item of each collection
+      active_rule1 = arules1.first
+      active_rule2 = arules2.first
+      if active_rule1 != nil and active_rule2 != nil
+        order = active_rule1.rule.key <=> active_rule2.rule.key
+        if order < 0
+          active_rule2 = nil
+          rule = active_rule1.rule
+          diff = true
+          removed = removed +1
+        elsif order > 0
+          active_rule1 = nil
+          rule = active_rule2.rule
+          diff = true
+          added = added +1
+        else
+          rule = active_rule1.rule # = active_rule2.rule
+          #compare severity
+          diff = true if active_rule1.priority != active_rule2.priority
+          #compare parameters
+          rule.parameters.each do |param|
+            diff = true if active_rule1.value(param.id) != active_rule2.value(param.id)
+          end
+          if diff
+            modified = modified + 1
+          else
+            same = same +1
+          end
+        end
+      elsif active_rule1 != nil
+        #no more rule in right collection
+        diff = true
+        removed = removed +1
+        rule = active_rule1.rule
+      elsif active_rule2 != nil
+        #no more rule in left collection
+        diff = true
+        added = added +1
+        rule = active_rule2.rule
+      end
+      # remove processed rule(s)
+      arules1 = arules1.drop(1) if active_rule1 != nil
+      arules2 = arules2.drop(1) if active_rule2 != nil
+      if diff
+        rules[rule] = [active_rule1, active_rule2]
+      end
+    end while !arules1.empty? || !arules2.empty?
+    return {:same => same, :added => added, :removed => removed, :modified => modified, :rules => rules}
+  end
+
+  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/>')
+    end
+    if messages.hasWarnings()
+      flash[:warning]=messages.getWarnings().to_a[0...4].join('<br/>')
+    end
+    if messages.hasInfos()
+      flash[:notice]=messages.getInfos().to_a[0...4].join('<br/>')
+    end
+  end
+
+  def flash_result(result)
+    # only 4 messages are kept each time to avoid cookie overflow.
+    unless result.infos.empty?
+      flash[:notice] += '<br/>' + result.infos.to_a[0...4].join('<br/>')
+    end
+    unless result.warnings.empty?
+      flash[:warning] = result.warnings.to_a[0...4].join('<br/>')
+    end
+
+  end
+
+  def set_profile_breadcrumbs
+    add_breadcrumbs OldProfilesController::root_breadcrumb, {:name => "#{@profile.name} (#{Api::Utils.language_name(@profile.language)})"}
+  end
+
+  def profile_id_to_key(profile_id)
+    profile = Profile.find(profile_id)
+    not_found('Profile not found') unless profile
+    profile.kee
+  end
+end
index 79b88b22bb05f776368caeba3b999829fc3e3bb4..28a940f72ec7568ec09a0f89c22b430b66a48669 100644 (file)
 # along with this program; if not, write to the Free Software Foundation,
 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 #
-class ProfilesController < ApplicationController
-
-  SECTION=Navigation::SECTION_QUALITY_PROFILES
 
-  def self.root_breadcrumb
-    {:name => Api::Utils.message('quality_profiles.page'), :url => {:controller => 'profiles', :action => 'index'}}
-  end
+class ProfilesController < ApplicationController
 
-  # GET /profiles/index
   def index
-    add_breadcrumbs ProfilesController::root_breadcrumb
-    call_backend do
-      @profiles = Internal.quality_profiles.allProfiles().to_a
-      @active_rule_counts = Internal.qprofile_loader.countAllActiveRules()
-    end
-    Api::Utils.insensitive_sort!(@profiles) { |profile| profile.name() }
-  end
-
-  # GET /profiles/show?key=<key>
-  def show
-    require_parameters 'key'
-    call_backend do
-      @profile = Internal.qprofile_loader.getByKey(params[:key])
-      if @profile
-        @deprecated_active_rules = Internal.qprofile_loader.countDeprecatedActiveRulesByProfile(@profile.getKey())
-        @stats = Internal.qprofile_loader.getStatsByProfile(@profile.getKey())
-        set_profile_breadcrumbs
-      else
-        # SONAR-5630
-        flash[:error] = message('quality_profiles.deleted_profile', :params => params[:key])
-        redirect_to :controller => 'profiles', :action => 'index'
-      end
-    end
-  end
-
-  # GET /profiles/create_form?language=<language>
-  def create_form
-    require_parameters 'language'
-    render :partial => 'profiles/create_form', :locals => {:language_key => params[:language]}
-  end
-
-  # POST /profiles/create?name=<profile name>&language=<language>&[backup=<file>]
-  def create
-    verify_post_request
-    call_backend do
-      files_by_key = {}
-      if params[:backup]
-        params[:backup].each_pair do |importer_key, file|
-          unless file.blank?
-            files_by_key[importer_key] = Api::Utils.read_post_request_param(file)
-          end
-        end
-      end
-      profile_name = Java::OrgSonarServerQualityprofile::QProfileName.new(params[:language], params[:name])
-      result = Internal.qprofile_service.create(profile_name, files_by_key)
-      flash[:notice] = message('quality_profiles.profile_x_created', :params => result.profile().getName())
-      flash_result(result)
-    end
-    redirect_to :action => 'index'
-  end
-
-  # Modal window to restore built-in profiles
-  # GET /profiles/restore_built_in_form/<profile id>
-  def restore_built_in_form
-    verify_ajax_request
-    require_parameters 'language'
-    @language = java_facade.getLanguages().find { |l| l.getKey()==params[:language].to_s }
-    call_backend do
-      @builtin_profile_names = Internal.qprofile_service.builtInProfileNamesForLanguage(params[:language].to_s)
-    end
-    render :partial => 'profiles/restore_built_in_form'
-  end
-
-  # POST /profiles/restore_built_in?language=<language>
-  def restore_built_in
-    verify_post_request
-    require_parameters 'language'
-    call_backend do
-      Internal.qprofile_service.restoreBuiltInProfilesForLanguage(params[:language].to_s)
-    end
-    redirect_to :action => 'index'
-  end
-
-  # POST /profiles/delete/<id>
-  def delete
-    verify_post_request
-    require_parameters 'id'
-
-    profile_key = profile_id_to_key(params[:id].to_i)
-    call_backend do
-      Internal.qprofile_service.delete(profile_key)
-    end
-
-    redirect_to(:controller => 'profiles', :action => 'index')
-  end
-
-
-  # POST /profiles/set_as_default/<id>
-  def set_as_default
-    verify_post_request
-    require_parameters 'id'
-
-    profile_key = profile_id_to_key(params[:id].to_i)
-    call_backend do
-      Internal.qprofile_service.setDefault(profile_key)
-    end
-    redirect_to :action => 'index'
-  end
-
-
-  # GET /profiles/copy_form/<profile id>
-  def copy_form
-    require_parameters 'id'
-
-    profile_id = params[:id].to_i
-    call_backend do
-      @profile = Internal.quality_profiles.profile(profile_id)
-    end
-    not_found('Profile not found') unless @profile
-
-    render :partial => 'profiles/copy_form'
-  end
-
-  # POST /profiles/copy/<id>?name=<name of new profile>[&overwrite=<name of overwritten profile>]
-  def copy
-    verify_post_request
-    verify_ajax_request
-    require_parameters 'id'
-
-    source_id = params[:id].to_i
-    source_profile = Internal.quality_profiles.profile(source_id)
-
-    source_key=profile_id_to_key(source_id)
-    target_name = params['name']
-
-    overwrite = (params['overwrite'] == target_name)
-    target_profile = nil
-
-    unless overwrite
-      target_profile = Internal.quality_profiles.profile(target_name, source_profile.language())
-    end
-
-    if target_profile.nil? || overwrite
-      call_backend do
-        Internal.qprofile_service.copyToName(source_key, target_name)
-        if overwrite
-          flash[:notice] = message('quality_profiles.copy_x_overwritten', :params => target_name)
-        else
-          flash[:notice] = message('quality_profiles.profile_x_not_activated', :params => target_name)
-        end
-        render :text => 'ok', :status => 200
-      end
-    else
-      render :text => message('quality_profiles.copy_overwrite_x', :params => target_name), :status => 409
-    end
-  end
-
-  # the backup action is allow to non-admin users : see http://jira.codehaus.org/browse/SONAR-2039
-  def backup
-    verify_post_request
-    require_parameters 'key'
-
-    profile_key=params[:key]
-    call_backend do
-      xml = Internal.qprofile_service.backup(profile_key)
-      send_data(xml, :type => 'text/xml', :disposition => "attachment; filename=#{profile_key}.xml")
-    end
-  end
-
-
-  # Modal window to restore profile backup
-  # GET /profiles/restore_form/<profile id>
-  def restore_form
-    verify_ajax_request
-    render :partial => 'profiles/restore_form'
-  end
-
-  # POST /profiles/restore?backup=<file>
-  def restore
-    if params[:backup].blank?
-      flash[:warning] = message('quality_profiles.please_upload_backup_file')
-    else
-      call_backend do
-        xml=Api::Utils.read_post_request_param(params[:backup])
-        Internal.qprofile_service.restore(xml)
-      end
-    end
-    redirect_to :action => 'index'
-  end
-
-
-  # GET /profiles/export?name=<profile name>&language=<language>&format<exporter key>
-  def export
-    language = params[:language]
-    if params[:name].blank?
-      profile = Internal.qprofile_service.getDefault(language)
-    else
-      profile = Internal.qprofile_loader.getByLangAndName(language, CGI::unescape(params[:name]))
-    end
-    not_found('Profile not found') unless profile
-
-    if params[:format].blank?
-      # standard sonar format
-      result = Internal.qprofile_service.backup(profile.getKee())
-      send_data(result, :type => 'text/xml', :disposition => 'inline')
-    else
-      exporter_key = params[:format]
-      result = Internal.qprofile_exporters.export(profile.getKee(), exporter_key)
-      send_data(result, :type => Internal.qprofile_exporters.mimeType(exporter_key), :disposition => 'inline')
-    end
-  end
-
-  # GET /profiles/inheritance?id=<profile id>
-  def inheritance
-    require_parameters 'id'
-
-    call_backend do
-      @profile = Internal.quality_profiles.profile(params[:id].to_i)
-      not_found('Profile not found') unless @profile
-      @parent = Internal.quality_profiles.parent(@profile) if @profile.parent
-      @ancestors = Internal.quality_profiles.ancestors(@profile).to_a
-      @children = Internal.quality_profiles.children(@profile).to_a
-      profiles = Internal.quality_profiles.profilesByLanguage(@profile.language()).to_a.reject { |p| p.id == @profile.id() || p.parent() == @profile.name() }
-      profiles = Api::Utils.insensitive_sort(profiles) { |p| p.name() }
-      @select_parent = [[message('none'), nil]] + profiles.collect { |profile| [profile.name(), profile.id()] }
-
-      @all_profile_stats = Internal.qprofile_loader.getAllProfileStats()
-    end
 
-    set_profile_breadcrumbs
   end
 
-  # POST /profiles/change_parent?id=<profile id>&parent_id=<parent id>
-  def change_parent
-    verify_post_request
-    access_denied unless has_role?(:profileadmin)
-    require_parameters 'id'
-
-    profile_key = profile_id_to_key(params[:id].to_i)
-    parent_key = profile_id_to_key(params[:parent_id].to_i) unless params[:parent_id].empty?
-    call_backend do
-      Internal.qprofile_service.setParent(profile_key, parent_key)
-    end
-    redirect_to :action => 'inheritance', :id => params[:id]
-  end
-
-  # GET /profiles/changelog?key=<profile key>
-  def changelog
-    require_parameters 'key'
-
-    @profile = Internal.qprofile_loader.getByKey(params[:key])
-    not_found('Quality profile does not exist') unless @profile
-    search = {'profileKey' => @profile.key().to_s, 'since' => params[:since], 'to' => params[:to], 'p' => params[:p]}
-    result = Internal.component(Java::OrgSonarServerActivity::RubyQProfileActivityService.java_class).search(search)
-    @changes = result.activities
-    @paging = result.paging
-
-    set_profile_breadcrumbs
-  end
-
-  #
-  #
-  # GET /profiles/permalinks?id=<profile id>
-  #
-  #
-  def permalinks
-    require_parameters 'id'
-    @profile = Internal.quality_profiles.profile(params[:id].to_i)
-    not_found('Profile not found') unless @profile
-    set_profile_breadcrumbs
-  end
-
-
-  #
-  #
-  # GET /profiles/projects/<id>
-  #
-  #
-  def projects
-    require_parameters 'id'
-
-    call_backend do
-      @profile = Internal.quality_profiles.profile(params[:id].to_i)
-      not_found('Profile not found') unless @profile
-      projects = Internal.quality_profiles.projects(params[:id].to_i)
-      @projects = Api::Utils.insensitive_sort(projects.to_a) { |p| p.name }
-      set_profile_breadcrumbs
-    end
-  end
-
-
-  # POST /profiles/add_project?id=<profile id>&project=<project id>
-  def add_project
-    verify_post_request
-    require_parameters 'id', 'project'
-
-    project_id = Api::Utils.project_id(params[:project])
-    profile_id = params[:id].to_i
-
-    call_backend do
-      Internal.quality_profiles.addProject(profile_id, project_id.to_i)
-    end
-    redirect_to :action => 'projects', :id => profile_id
-  end
-
-  # POST /profiles/remove_project?id=<profile id>&project=<project id>
-  def remove_project
-    verify_post_request
-    require_parameters 'id', 'project'
-
-    profile_id = params[:id].to_i
-    call_backend do
-      Internal.quality_profiles.removeProject(profile_id, params[:project].to_i)
-    end
-    redirect_to :action => 'projects', :id => profile_id
-  end
-
-  # POST /profiles/remove_projects?id=<profile id>
-  def remove_projects
-    verify_post_request
-    require_parameters 'id'
-
-    profile_id = params[:id].to_i
-    call_backend do
-      Internal.quality_profiles.removeAllProjects(profile_id)
-    end
-    redirect_to :action => 'projects', :id => profile_id
-  end
-
-  # GET /profiles/rename_form?id=<id>
-  def rename_form
-    require_parameters 'id'
-    call_backend do
-      @profile = Internal.quality_profiles.profile(params[:id].to_i)
-      not_found('Profile not found') unless @profile
-    end
-    render :partial => 'profiles/rename_form'
-  end
-
-  # POST /profiles/rename?id=<id>&name=<new name>
-  def rename
-    verify_post_request
-    verify_ajax_request
-    require_parameters 'id'
-
-    call_backend do
-      profile_key = profile_id_to_key(params[:id].to_i)
-      Internal.qprofile_service.rename(profile_key, params[:new_name])
-    end
-    render :text => 'ok', :status => 200
-  end
-
-  # GET /profiles/compare?id1=<profile1 id>&id2=<profile2 id>
-  def compare
-    @profiles = Profile.all(:order => 'language asc, name')
-    id1 = params[:id1]
-    id2 = params[:id2]
-    if id1.present? && id2.present? && id1.respond_to?(:to_i) && id2.respond_to?(:to_i)
-      @id1 = params[:id1].to_i
-      @id2 = params[:id2].to_i
-      @profile1 = Profile.find(id1)
-      @profile2 = Profile.find(id2)
-
-      arules1 = ActiveRule.all(:include => [{:active_rule_parameters => :rules_parameter}, :rule],
-                               :conditions => ['active_rules.profile_id=?', @profile1.id])
-      arules2 = ActiveRule.all(:order => 'rules.plugin_name, rules.plugin_rule_key', :include => [{:active_rule_parameters => :rules_parameter}, :rule],
-                               :conditions => ['active_rules.profile_id=?', @profile2.id])
-
-      arules1.reject! { |arule| arule.rule.removed? }
-      arules2.reject! { |arule| arule.rule.removed? }
-
-      diffs_by_rule={}
-      arules1.each do |arule1|
-        diffs_by_rule[arule1.rule]||=RuleDiff.new(arule1.rule)
-        diffs_by_rule[arule1.rule].arule1=arule1
-      end
-      arules2.each do |arule2|
-        diffs_by_rule[arule2.rule]||=RuleDiff.new(arule2.rule)
-        diffs_by_rule[arule2.rule].arule2=arule2
-      end
-      @in1=[]
-      @in2=[]
-      @modified=[]
-      @sames=[]
-      diffs_by_rule.values.sort.each do |diff|
-        case diff.status
-          when DIFF_IN1 then
-            @in1<<diff
-          when DIFF_IN2 then
-            @in2<<diff
-          when DIFF_MODIFIED then
-            @modified<<diff
-          when DIFF_SAME then
-            @sames<<diff
-        end
-      end
-    end
-    add_breadcrumbs ProfilesController::root_breadcrumb, Api::Utils.message('compare')
-  end
-
-  DIFF_IN1=1
-  DIFF_IN2=2
-  DIFF_MODIFIED=3
-  DIFF_SAME=4
-
-  private
-
-  class RuleDiff
-    attr_reader :rule, :removed_params, :added_params
-    attr_accessor :arule1, :arule2
-
-    def initialize(rule)
-      @rule=rule
-    end
-
-    def status
-      @status ||=
-          begin
-            if @arule1.nil?
-              @status=(@arule2 ? DIFF_IN2 : nil)
-            else
-              if @arule2
-                # compare severity and parameters
-                @removed_params=[]
-                @added_params=[]
-                @rule.parameters.each do |param|
-                  v1=@arule1.value(param.id)
-                  v2=@arule2.value(param.id)
-                  if v1
-                    if v2
-                      if v1!=v2
-                        @removed_params<<@arule1.parameter(param.name)
-                        @added_params<<@arule2.parameter(param.name)
-                      end
-                    else
-                      @removed_params<<@arule1.parameter(param.name)
-                    end
-                  elsif v2
-                    @added_params<<@arule2.parameter(param.name)
-                  end
-                end
-                diff=(@arule1.priority!=@arule2.priority) || !@removed_params.empty? || !@added_params.empty?
-                @status=(diff ? DIFF_MODIFIED : DIFF_SAME)
-              else
-                @status=DIFF_IN1
-              end
-            end
-          end
-    end
-
-    def <=>(other)
-      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,
-  # :rules => {rule1 => [activeruleleft1, activeruleright1], rule2 => [activeruleleft2, nil], ...]}
-  # Assume both collections are ordered by rule key
-  #
-  def compute_diff(arules1, arules2)
-    rules = {}
-    removed = 0
-    added = 0
-    modified = 0
-    same = 0
-    begin
-      diff = false
-      #take first item of each collection
-      active_rule1 = arules1.first
-      active_rule2 = arules2.first
-      if active_rule1 != nil and active_rule2 != nil
-        order = active_rule1.rule.key <=> active_rule2.rule.key
-        if order < 0
-          active_rule2 = nil
-          rule = active_rule1.rule
-          diff = true
-          removed = removed +1
-        elsif order > 0
-          active_rule1 = nil
-          rule = active_rule2.rule
-          diff = true
-          added = added +1
-        else
-          rule = active_rule1.rule # = active_rule2.rule
-          #compare severity
-          diff = true if active_rule1.priority != active_rule2.priority
-          #compare parameters
-          rule.parameters.each do |param|
-            diff = true if active_rule1.value(param.id) != active_rule2.value(param.id)
-          end
-          if diff
-            modified = modified + 1
-          else
-            same = same +1
-          end
-        end
-      elsif active_rule1 != nil
-        #no more rule in right collection
-        diff = true
-        removed = removed +1
-        rule = active_rule1.rule
-      elsif active_rule2 != nil
-        #no more rule in left collection
-        diff = true
-        added = added +1
-        rule = active_rule2.rule
-      end
-      # remove processed rule(s)
-      arules1 = arules1.drop(1) if active_rule1 != nil
-      arules2 = arules2.drop(1) if active_rule2 != nil
-      if diff
-        rules[rule] = [active_rule1, active_rule2]
-      end
-    end while !arules1.empty? || !arules2.empty?
-    return {:same => same, :added => added, :removed => removed, :modified => modified, :rules => rules}
-  end
-
-  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/>')
-    end
-    if messages.hasWarnings()
-      flash[:warning]=messages.getWarnings().to_a[0...4].join('<br/>')
-    end
-    if messages.hasInfos()
-      flash[:notice]=messages.getInfos().to_a[0...4].join('<br/>')
-    end
-  end
-
-  def flash_result(result)
-    # only 4 messages are kept each time to avoid cookie overflow.
-    unless result.infos.empty?
-      flash[:notice] += '<br/>' + result.infos.to_a[0...4].join('<br/>')
-    end
-    unless result.warnings.empty?
-      flash[:warning] = result.warnings.to_a[0...4].join('<br/>')
-    end
-
-  end
-
-  def set_profile_breadcrumbs
-    add_breadcrumbs ProfilesController::root_breadcrumb, {:name => "#{@profile.name} (#{Api::Utils.language_name(@profile.language)})"}
+  def show
+    render :action => 'index'
   end
 
-  def profile_id_to_key(profile_id)
-    profile = Profile.find(profile_id)
-    not_found('Profile not found') unless profile
-    profile.kee
-  end
 end
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/quality_profiles_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/quality_profiles_controller.rb
deleted file mode 100644 (file)
index 3c84dc7..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# SonarQube, open source software quality management tool.
-# Copyright (C) 2008-2014 SonarSource
-# mailto:contact AT sonarsource DOT com
-#
-# SonarQube 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.
-#
-# SonarQube 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 this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-#
-
-class QualityProfilesController < ApplicationController
-
-  SECTION=Navigation::SECTION_QUALITY_PROFILES
-
-  def index
-
-  end
-
-  def show
-    render :action => 'index'
-  end
-
-end
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_copy_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_copy_form.html.erb
new file mode 100644 (file)
index 0000000..0205415
--- /dev/null
@@ -0,0 +1,42 @@
+<form id="copy-profile-form" method="post" action="old_profiles/copy">
+  <input type="hidden" name="id" value="<%= @profile.id -%>"/>
+  <fieldset>
+    <div class="modal-head">
+      <h2> <%= message('quality_profiles.copy_x_title', :params => [h @profile.name]) -%></h2>
+    </div>
+    <div class="modal-body">
+      <div class="modal-error"/>
+      <div class="modal-warning"/>
+      <div class="modal-field">
+        <label for="name"><%= message 'quality_profiles.copy_new_name' -%> <em class="mandatory">*</em></label>
+        <input id="copy-name" name="name" type="text" size="50" maxlength="100" autofocus="autofocus"/>
+      </div>
+    </div>
+    <div class="modal-foot">
+      <input type="hidden" value="" name="overwrite" id="copy-overwrite"/>
+      <input type="submit" value="<%= h message('copy') -%>" id="copy-submit"/>
+      <a href="#" onclick="return closeModalWindow()" id="copy-cancel"><%= h message('cancel') -%></a>
+    </div>
+  </fieldset>
+</form>
+<script>
+  $j("#copy-profile-form").modalForm({
+    error: function (xhr) {
+      if (xhr.status == 409) {
+        $j('#copy-profile-form .modal-error').hide();
+        var warningElt = $j('#copy-profile-form .modal-warning');
+        $j('#copy-overwrite').val($j('#copy-name').val());
+        $j('#copy-profile-form input[type=submit]').removeAttr('disabled');
+        warningElt.html(xhr.responseText);
+        warningElt.show();
+      } else {
+        $j('#copy-profile-form .modal-warning').hide();
+        var errorElt = $j('#copy-profile-form .modal-error');
+        $j('.loading-image').addClass("hidden");
+        $j('#copy-profile-form input[type=submit]').removeAttr('disabled');
+        errorElt.html(xhr.responseText);
+        errorElt.show();
+      }
+    }
+  });
+</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_create_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_create_form.html.erb
new file mode 100644 (file)
index 0000000..2e00659
--- /dev/null
@@ -0,0 +1,35 @@
+<%
+   language = controller.java_facade.getLanguages().find { |l| l.getKey()==language_key }
+   importers = Internal.component(Java::OrgSonarServerQualityprofile::QProfileExporters.java_class).findProfileImportersForLanguage(language_key)
+%>
+<form id="create-profile-form" action="old_profiles/create" enctype="multipart/form-data" method="POST">
+  <fieldset>
+    <input type="hidden" name="language" value="<%= language_key -%>"/>
+
+    <div class="modal-head">
+      <h2><%= h message('quality_profiles.create_x_language_profile', :params => language.getName()) -%></h2>
+    </div>
+
+    <div class="modal-body">
+
+      <div class="modal-field">
+        <label for="name"><%= message('name') -%> <em class="mandatory">*</em></label>
+        <input id="create-profile-name" name="name" type="text" size="50" maxlength="100" autofocus="autofocus"/>
+      </div>
+
+      <% importers.to_a.sort { |x, y| x.getName() <=> y.getName() }.each do |importer| %>
+        <div class="modal-field">
+          <label for="backup[<%= importer.getKey() -%>]"><%= h importer.getName() -%></label>
+          <%= file_field_tag "backup[#{importer.getKey()}]" %>
+          <div class="modal-field-description"><%= h message('quality_profiles.optional_configuration_file') -%></div>
+        </div>
+      <% end %>
+    </div>
+
+    <div class="modal-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>
+
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_diff_rule.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_diff_rule.html.erb
new file mode 100644 (file)
index 0000000..36ae86f
--- /dev/null
@@ -0,0 +1,6 @@
+<i class="icon-severity-<%= arule.priority -%>"></i>
+
+<a href="<%= url_for :controller => 'coding_rules', :action => 'index', :anchor => 'rule_key=' + arule.rule.key + '|qprofile=' + aprofile.kee -%>">
+  <%= h(arule.rule.name) -%>
+</a>
+<span class="note"><%= h(arule.rule.plugin_name) -%></span>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_new.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_new.html.erb
new file mode 100644 (file)
index 0000000..bb170e9
--- /dev/null
@@ -0,0 +1,56 @@
+<div class="admin">
+<% form_tag({:action => 'create'}, {:multipart => true, :id => 'form_create_profile'}) do -%>
+  <table class="spaced">
+    <tr>
+      <td align="left" nowrap="nowrap" width="1%">
+        <%= message('name') -%>
+      </td>
+      <td align="left">
+        <input type="text" name="name"/>
+      </td>
+    </tr>
+    <tr>
+      <td align="left" nowrap="nowrap">
+        <%= message('language') -%>
+      </td>
+      <td align="left">
+        <% languages_select=languages.collect do |language|
+              [language.getName(), language.getKey()]
+           end
+       %>
+        <%= select_tag :language, options_for_select(languages_select), :onClick => 'changeLanguage();' %>
+      </td>
+    </tr>
+  </table>
+
+  <% languages.each do |language| %>
+    <% if @plugins_by_language[language.getKey()] %>
+    <table class="spaced language_class" id="<%= language.getKey() %>" style="display:none">
+      <% @plugins_by_language[language.getKey()].each do |plugin| %>
+      <tr>
+        <td align="left" style="vertical-align: top;"  nowrap="nowrap" width="1%">
+          <%= image_tag'bullet.png' %> <%= plugin.getName() %> XML (<%= message('optional').downcase -%>)
+        </td>
+        <td align="left">
+          <%= file_field_tag plugin.getKey() %>
+        </td>
+      </tr>
+      <% end %>
+    </table>
+    <% end %>
+  <% end %>
+
+  <table class="spaced">
+    <tr>
+      <td colspan="2" align="left">
+        <%= submit_tag message('create') %>
+        <a href="<%= url_for :controller => 'old_profiles', :action => 'index' -%>" class="action"><%= message('cancel') -%></a>
+      </td>
+    </tr>
+  </table>
+<% end %>
+</div>
+
+<script type="text/javascript">
+    changeLanguage();
+</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_rename_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_rename_form.html.erb
new file mode 100644 (file)
index 0000000..823859f
--- /dev/null
@@ -0,0 +1,25 @@
+<form id="rename-profile-form" method="post" action="old_profiles/rename">
+  <input type="hidden" name="id" value="<%= @profile.id -%>"/>
+  <fieldset>
+
+    <div class="modal-head">
+      <h2>Rename Profile: <%= h @profile.name -%></h2>
+    </div>
+
+    <div class="modal-body">
+      <div class="modal-error"/>
+
+      <div class="modal-field">
+        <label for="new_name">New name <em class="mandatory">*</em></label>
+        <input id="new-name" name="new_name" type="text" size="50" maxlength="100" autofocus="autofocus"/>
+      </div>
+    </div>
+    <div class="modal-foot">
+      <input type="submit" value="<%= h message('rename') -%>" id="rename-submit"/>
+      <a href="#" onclick="return closeModalWindow()" id="rename-cancel"><%= h message('cancel') -%></a>
+    </div>
+  </fieldset>
+</form>
+<script>
+  $j("#rename-profile-form").modalForm();
+</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_restore_built_in_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_restore_built_in_form.html.erb
new file mode 100644 (file)
index 0000000..96a4477
--- /dev/null
@@ -0,0 +1,21 @@
+<form id="restore-built-in-profiles-form" action="old_profiles/restore_built_in" method="POST">
+  <fieldset>
+    <input type="hidden" name="language" value="<%= @language.getKey() -%>"/>
+
+    <div class="modal-head">
+      <h2><%= h message('quality_profiles.restore_built_in_profiles') -%></h2>
+    </div>
+
+    <div class="modal-body">
+      <%= h message('quality_profiles.restore_built_in_profiles_confirmation', :params => [@builtin_profile_names.join('\', \''), @language.getName()]) -%>
+    </div>
+
+    <div class="modal-foot">
+      <input type="submit" value="<%= h message('restore') -%>" id="restore-built-in-profiles-submit"/>
+      <a href="#" onclick="return closeModalWindow()" id="restore-built-in-profiles-cancel"><%= h message('cancel') -%></a>
+    </div>
+  </fieldset>
+</form>
+<script>
+  $j("#restore-built-in-profiles-form").modalForm();
+</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_restore_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_restore_form.html.erb
new file mode 100644 (file)
index 0000000..4ea22e7
--- /dev/null
@@ -0,0 +1,21 @@
+<form id="restore-profile-form" action="old_profiles/restore" enctype="multipart/form-data" method="POST">
+  <fieldset>
+
+    <div class="modal-head">
+      <h2><%= h message('quality_profiles.restore_built_in_profiles') -%></h2>
+    </div>
+
+    <div class="modal-body">
+      <div class="modal-field">
+        <label for="name"><%= message('backup') -%> <em class="mandatory">*</em></label>
+        <%= file_field_tag 'backup' %>
+      </div>
+
+    </div>
+
+    <div class="modal-foot">
+      <input type="submit" value="<%= h message('quality_profiles.restore_submit') -%>" id="restore-profile-submit"/>
+      <a href="#" onclick="return closeModalWindow()" id="restore-profile-cancel"><%= h message('cancel') -%></a>
+    </div>
+  </fieldset>
+</form>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_tabs.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/_tabs.html.erb
new file mode 100644 (file)
index 0000000..3d6e5d8
--- /dev/null
@@ -0,0 +1,26 @@
+<%
+  new_tab = nil unless defined?(:new_tab)
+  selected_tab = nil unless defined?(:selected_tab)
+%>
+<ul class="tabs">
+  <li>
+    <a href="<%= url_for :controller => 'old_profiles', :action => 'show', :key => @profile.key() -%>" <%= "class='selected'" if selected_tab.nil? || selected_tab=='Rules' -%> id="tab-rules"><%= message('coding_rules') -%></a>
+  </li>
+  <li>
+    <a href="<%= url_for :controller => 'old_profiles', :action => 'projects', :id => @profile.id -%>" <%= "class='selected'" if selected_tab=='Projects' -%> id="tab-projects"><%= message('projects') -%></a>
+  </li>
+  <li>
+    <a href="<%= url_for :controller => 'old_profiles', :action => 'permalinks', :id => @profile.id -%>" <%= "class='selected'" if selected_tab=='Permalinks' -%> id="tab-permalinks"><%= message('permalinks') -%></a>
+  </li>
+  <li>
+    <a href="<%= url_for :controller => 'old_profiles', :action => 'inheritance', :id => @profile.id -%>" <%= "class='selected'" if selected_tab=='inheritance' -%> id="tab-inheritance"><%= message('quality_profiles.profile_inheritance') -%></a>
+  </li>
+  <li>
+    <a href="<%= url_for :controller => 'old_profiles', :action => 'changelog', :key => @profile.key() -%>" <%= "class='selected'" if selected_tab=='changelog' -%> id="tab-changelog"><%= message('changelog') -%></a>
+  </li>
+  <% if new_tab %>
+  <li>
+    <a href="#" class='selected'><%= new_tab -%></a>
+  </li>
+  <% end %>
+</ul>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/changelog.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/changelog.html.erb
new file mode 100644 (file)
index 0000000..1f81c67
--- /dev/null
@@ -0,0 +1,81 @@
+<div class="page">
+  <header class="page-header">
+    <h1 class="page-title"><%= h @profile.name -%></h1>
+    <div class="page-description">
+      <a href="<%= ApplicationController.root_context -%>/old_profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
+    </div>
+  </header>
+<%= render :partial => 'old_profiles/tabs', :locals => {:selected_tab=>'changelog'} %>
+
+<div class="tabs-panel marginbottom10">
+  <form class="marginbottom10" method="get" action="<%= ApplicationController.root_context %>/old_profiles/changelog">
+    <input name="key" type="hidden" value="<%= @profile.key() %>"/>
+    <%= message('quality_profiles.changelog_from') -%>
+    <input name="since" type="text" value="<%= params['since'] %>" placeholder="1970-01-31"/>
+    <%= message('to').downcase -%>
+    <input name="to" type="text" value="<%= params['to'] %>" placeholder="1970-01-31"/>
+    <input type="submit" value="<%= h message('search_verb') -%>" id="submit"/>
+  </form>
+
+  <% if @changes.empty? %>
+    <%= message('quality_profiles.changelog.empty') -%>
+  <% else %>
+
+    <table id="profile-changelog" class="data width100">
+      <thead>
+        <tr>
+          <th><%= message('date') -%></th>
+          <th><%= message('user') -%></th>
+          <th><%= message('action') -%></th>
+          <th><%= message('rule') -%></th>
+          <th><%= message('parameters') -%></th>
+        </tr>
+      </thead>
+      <tbody>
+        <%
+          @changes.each do |change|
+        %>
+        <tr class="<%= cycle('even', 'odd') -%>">
+          <%
+             action = change.getAction()
+             action_message = message('quality_profiles.changelog.' + action.downcase) if action
+
+             if change.authorName() && !change.authorName().empty?()
+               author = change.authorName()
+             elsif change.login() && !change.getLogin().empty?()
+               author = change.getLogin()
+             else
+               author = 'System'
+             end
+             rule = change.ruleName() ? change.ruleName() : change.ruleKey()
+          %>
+          <td valign="top" width="1%" nowrap><%= Internal.i18n.formatDateTime(change.getCreatedAt()) -%></td>
+          <td valign="top" width="1%" nowrap><%= author %></td>
+          <td valign="top" width="1%" nowrap><%= action_message %></td>
+          <td valign="top"><%= rule %></td>
+          <td valign="top">
+            <% if change.severity() %>
+              <%= message('quality_profiles.severity_set_to_x', :params => ["<i class=\"icon-severity-#{change.severity().downcase}\"></i>", change.severity()]) -%>
+              <br/>
+            <% end %>
+            <% change.parameters().each do |param_key, param_value| %>
+              <% unless param_value.empty? %>
+                <%= message('quality_profiles.parameter_set_to_x', :params => [param_key, param_value]) -%>
+              <% else %>
+                <%= message('quality_profiles.changelog.parameter_reset_to_default_value_x', :params => [param_key]) -%>
+              <% end %>
+              <br/>
+            <% end %>
+          </td>
+        </tr>
+        <% end %>
+      </tbody>
+      <%= paginate_java(@paging, :colspan => 5, :include_loading_icon => true) { |label, page_id|
+        link_to(label, params.merge({:p => page_id}), :style => 'text-decoration:underline')
+      }
+      %>
+    </table>
+
+  <% end %>
+</div>
+</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/compare.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/compare.html.erb
new file mode 100644 (file)
index 0000000..00d2bf2
--- /dev/null
@@ -0,0 +1,150 @@
+<div class="page">
+  <header class="page-header">
+    <h1 class="page-title"><%= h message('quality_profiles.compare_profiles') -%></h1>
+    <div class="page-description">
+      <a href="<%= ApplicationController.root_context -%>/old_profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
+    </div>
+  </header>
+
+<form method="GET" class="marginbottom10">
+  <select name="id1" class="small">
+    <option value=""></option>
+    <%= options_for_profiles(@profiles, @id1) %>
+  </select>
+
+  <select name="id2" class="small">
+    <option value=""></option>
+    <%= options_for_profiles(@profiles, @id2) %>
+  </select>
+  <input type="submit" value="<%= message('compare') -%>" class="small" id="submit-compare"/>
+</form>
+
+<% if @profile1 && @profile2 %>
+
+  <table class="header1" id="comparison-header">
+    <tr>
+      <td width="25%">
+        <p><%= message('quality_profiles.only_in_profile_x', :params => h(@profile1.name)) -%></p>
+        <span class="big"><a href="#in1" id="in1Value"><%= @in1.size -%></a></span> <%= message('rules').downcase -%>
+      </td>
+      <td width="25%">
+        <p><%= message('quality_profiles.only_in_profile_x', :params => h(@profile2.name)) -%></p>
+        <span class="big"><a href="#in2" id="in2Value"><%= @in2.size -%></a></span> <%= message('rules').downcase -%>
+      </td>
+      <td width="25%">
+        <p><%= message('quality_profiles.with_different_configuration') -%></p>
+        <span class="big"><a href="#modified" id="modifiedValue"><%= @modified.size -%></a></span> <%= message('rules').downcase -%>
+      </td>
+      <td width="25%">
+        <p><%= message('quality_profiles.with_same_configuration') -%></p>
+        <span class="big" id="sameValue"><%= @sames.size -%></span> <%= message('rules').downcase -%>
+      </td>
+    </tr>
+  </table>
+
+  <table class="width100 marginbottom10" id="profile_diff_table">
+    <tbody>
+
+    <% unless @in1.empty? %>
+      <tr>
+        <td width="49%">
+          <table class="data width100 marginbottom10" id="in1-rules">
+            <thead>
+            <tr>
+              <th><a name="in1"/><%= message('quality_profiles.x_rules_only_in', :params => @in1.size) %>
+                <a href="<%= url_for :controller => 'old_profiles', :action => 'show', :key => @profile1.kee -%>"><%= h @profile1.name %></a>
+              </th>
+            </tr>
+            </thead>
+            <% @in1.each do |diff| %>
+              <tr id="rule_<%= u(diff.rule.key) -%>">
+                <td class="<%= cycle('even', 'odd', :name => 'in1') -%>">
+                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule1, :aprofile => @profile1} %>
+                </td>
+              </tr>
+            <% end %>
+          </table>
+        </td>
+        <td width="2%"></td>
+        <td width="49%"></td>
+      </tr>
+    <% end %>
+
+    <% unless @in2.empty? %>
+      <tr>
+        <td width="49%"></td>
+        <td width="2%"></td>
+        <td width="49%">
+          <table class="data width100 marginbottom10" id="in2-rules">
+            <thead>
+            <tr>
+              <th><a name="in2"/><%= message('quality_profiles.x_rules_only_in', :params => @in2.size) %>
+                <a href="<%= url_for :controller => 'old_profiles', :action => 'show', :key => @profile2.kee -%>"><%= h @profile2.name %></a>
+              </th>
+            </tr>
+            </thead>
+            <% @in2.each do |diff| %>
+              <tr id="rule_<%= u(diff.rule.key) -%>">
+                <td class="<%= cycle('even', 'odd', :name => 'in2') -%>">
+                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule2, :aprofile => @profile2} %>
+                </td>
+              </tr>
+            <% end %>
+          </table>
+        </td>
+      </tr>
+    <% end %>
+
+
+    <% unless @modified.empty? %>
+      <tr>
+        <td colspan="3">
+          <table class="data width100 marginbottom10" id="modified-rules">
+            <thead>
+            <tr>
+              <th width="49%"><a name="modified"/><%= message('quality_profiles.x_rules_have_different_configuration', :params =>@modified.size) -%><br/>
+                <a href="<%= url_for :controller => 'old_profiles', :action => 'show', :key => @profile1.kee -%>"><%= h @profile1.name %></a>
+              </th>
+              <th width="2%"></th>
+              <th width="49%">
+                <br/><a href="<%= url_for :controller => 'old_profiles', :action => 'show', :key => @profile2.kee -%>"><%= h @profile2.name %></a>
+              </th>
+            </tr>
+            </thead>
+            <% @modified.each do |diff|
+              td_css=cycle('even', 'odd', :name => 'modified')
+            %>
+              <tr id="rule_<%= u(diff.rule.key) -%>">
+                <td class="<%= td_css -%>" width="49%">
+                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule1, :aprofile => @profile1} %>
+                  <% if diff.removed_params && !diff.removed_params.empty? %>
+                    <ul>
+                      <% diff.removed_params.each do |parameter| %>
+                        <li><%= h(parameter.name) -%>:
+                          <span class="diffParam"><%= parameter.value.gsub(',', ', ') -%></span></li>
+                      <% end %>
+                    </ul>
+                  <% end %>
+                </td>
+                <td width="2%" class="<%= td_css -%>"></td>
+                <td class="<%= td_css -%>" width="49%">
+                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule2, :aprofile => @profile2} %>
+                  <% if diff.added_params && !diff.added_params.empty? %>
+                    <ul>
+                      <% diff.added_params.each do |parameter| %>
+                        <li><%= h(parameter.name) -%>:
+                          <span class="diffParam"><%= parameter.value.gsub(',', ', ') -%></span></li>
+                      <% end %>
+                    </ul>
+                  <% end %>
+                </td>
+              </tr>
+            <% end %>
+          </table>
+        </td>
+      </tr>
+    <% end %>
+    </tbody>
+  </table>
+<% end %>
+</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/edit.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/edit.html.erb
new file mode 100644 (file)
index 0000000..b96cabb
--- /dev/null
@@ -0,0 +1,20 @@
+<h1>message('quality_profiles.editing_profile')</h1>
+
+<% form_for(@profile) do |f| %>
+  <%= f.error_messages %>
+
+  <p>
+    <%= f.label :name %><br />
+    <%= f.text_field :name %>
+  </p>
+  <p>
+    <%= f.label :active %><br />
+    <%= f.check_box :active %>
+  </p>
+  <p>
+    <%= f.submit message('update_verb') %>
+  </p>
+<% end %>
+
+<%= link_to message('show_verb'), @profile %> |
+<%= link_to message('back'), profiles_path %>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/index.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/index.html.erb
new file mode 100644 (file)
index 0000000..c499adf
--- /dev/null
@@ -0,0 +1,133 @@
+<div class="page">
+
+  <div class="page-header">
+    <h1 class="page-title"><%= h message('quality_profiles.page') -%></h1>
+
+    <div class="page-actions">
+      <div class="button-group">
+        <a href="old_profiles/compare" id="compare-link" class="button"><i class="icon-compare"></i> <%= message('quality_profiles.compare_profiles') -%>
+        </a>
+        <% if profiles_administrator? %>
+          <a href="old_profiles/restore_form" class="open-modal button" id="restore-link"><i class="icon-restore"></i> <%= message('quality_profiles.restore_profile') -%>
+          </a>
+        <% end %>
+      </div>
+    </div>
+  </div>
+
+<%
+   Api::Utils.insensitive_sort(languages){|l| l.getName()}.each do |language|
+      default_profile = Internal.component(Java::OrgSonarServerQualityprofile::QProfileService.java_class).getDefault(language.getKey())
+%>
+  <div class="line-block">
+    <% if profiles_administrator? %>
+      <ul style="float: right" class="horizontal">
+        <li class="marginleft10">
+          <i class="icon-plus"></i>
+          <a id="create-link-<%= language.getKey() -%>" href="<%= ApplicationController.root_context -%>/old_profiles/create_form?language=<%= u language.getKey() -%>"
+             class="open-modal link-action"><%= message('create') -%></a>
+        </li>
+      </ul>
+      <ul style="float: right" class="horizontal">
+        <li class="marginleft10">
+          <a id="create-link-<%= language.getKey() -%>" href="<%= ApplicationController.root_context -%>/old_profiles/restore_built_in_form?language=<%= u language.getKey() -%>"
+             class="open-modal link-action"><%= message('quality_profiles.restore_built_in_profiles') -%></a>
+        </li>
+      </ul>
+    <% end %>
+    <h2><%= message('quality_profiles.x_language_profiles', :params => language.getName()) -%></h2>
+  </div>
+
+  <table class="data width100" id="profiles_<%= language.getKey() -%>">
+    <thead>
+    <tr>
+      <th class="text-left"><%= message('name') -%></th>
+      <th class="text-right"><%= message('rules') -%></th>
+      <th class="text-right"><%= message('projects') -%></th>
+      <th class="text-right"><%= message('default') -%></th>
+      <% if profiles_administrator? %>
+        <th width="1%" class="text-right" colspan="4"><%= message('operations') -%></th>
+      <% end %>
+    </tr>
+    </thead>
+    <tbody>
+    <% @profiles.select { |p| p.language == language.getKey() }.each do |profile|
+       projects_count = projects_count(profile)
+       is_default_profile = default_profile && default_profile.key()==profile.key()
+    %>
+      <tr class="<%= cycle 'even', 'odd', :name => language.getKey() -%> hoverable" id="<%= u profile.key() %>">
+        <td  width="40%">
+          <a href="<%= url_for :controller => 'old_profiles', :action => 'show', :key => profile.key() -%>"
+             id="rules-<%= profile.key() -%>"><%= h profile.name() -%></a>
+        </td>
+
+        <td align="right" width="10%">
+          <%
+             rules_tooltip = message('quality_profiles.see_rules_tooltip_x_profile', :params => [profile.name()])
+             rules_tooltip = message('quality_profiles.manage_rules_tooltip_x_profile', :params => [profile.name()]) if profiles_administrator?
+          %>
+          <a class="widget-link"
+             href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{profile.key()}|activation=true|languages=#{profile.language()}" -%>"
+             title="<%= rules_tooltip %>">
+            <span id="activated_rules_<%= u profile.key() -%>">
+            <%= @active_rule_counts[profile.key()] || 0 -%>
+          </span>
+          </a>
+        </td>
+
+        <td align="right" width="10%" nowrap>
+          <% unless is_default_profile %>
+            <span id="projects_<%= u profile.key() -%>"><%= projects_count -%></span>
+          <% end %>
+        </td>
+
+        <td align="right" width="10%" nowrap>
+          <% if !is_default_profile && profiles_administrator? %>
+            <%= link_to_action message('set_as_default'), "#{ApplicationController.root_context}/old_profiles/set_as_default?id=#{profile.id()}",
+                               :id => "activate_#{profile.key().parameterize}",
+                               :class => 'link-action',
+                               :confirm_title => message('set_as_default'),
+                               :confirm_msg => message('quality_profiles.are_you_sure_want_x_profile_as_default', :params => [profile.name()]),
+                               :confirm_button => message('set_as_default')
+            -%>
+          <% end %>
+          <% if is_default_profile %>
+            <i class="icon-check" id='<%= "is_active_#{u profile.key()}" -%>'></i>
+          <% end %>
+        </td>
+
+        <td align="right" nowrap>
+          <form method="post" action="<%= ApplicationController.root_context -%>/old_profiles/backup" id="backup-<%= profile.key().parameterize -%>-form">
+            <input type="hidden" name="key" value="<%= profile.key() -%>"/>
+            <a href="#" class="link-action" name="button_backup" id="backup_<%= u profile.key() -%>" onclick="$j('#backup-<%= profile.key().parameterize -%>-form').submit();return false;"><%= message('backup_verb') -%></a>
+          </form>
+        </td>
+        <% if profiles_administrator? %>
+          <td align="right">
+            <a id="rename-<%= profile.key().parameterize -%>" href="<%= ApplicationController.root_context -%>/old_profiles/rename_form/<%= profile.id() -%>" class="link-action open-modal"><%= message('rename') -%></a>
+          </td>
+
+          <td align="right">
+            <a id="copy-<%= profile.key().parameterize -%>" href="<%= ApplicationController.root_context -%>/old_profiles/copy_form/<%= profile.id() -%>" class="link-action open-modal"><%= message('copy') -%></a>
+          </td>
+
+          <td>
+            <% if !is_default_profile %>
+              <%= link_to_action message('delete'), "#{ApplicationController.root_context}/old_profiles/delete/#{profile.id()}",
+                                 :class => 'link-action link-red',
+                                 :id => "delete_#{profile.key().parameterize}",
+                                 :confirm_button => message('delete'),
+                                 :confirm_title => 'quality_profiles.delete_confirm_title',
+                                 :confirm_msg => 'quality_profiles.are_you_sure_want_delete_profile_x_and_descendants',
+                                 :confirm_msg_params => [profile.name()]
+              -%>
+            <% end %>
+          </td>
+        <% end %>
+      </tr>
+    <% end %>
+    </tbody>
+  </table>
+  <br/><br/>
+<% end %>
+</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/inheritance.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/inheritance.html.erb
new file mode 100644 (file)
index 0000000..167b051
--- /dev/null
@@ -0,0 +1,54 @@
+<div class="page">
+  <header class="page-header">
+    <h1 class="page-title"><%= h @profile.name -%></h1>
+    <div class="page-description">
+      <a href="<%= ApplicationController.root_context -%>/old_profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
+    </div>
+  </header>
+
+<%= render :partial => 'old_profiles/tabs', :locals => {:selected_tab=>'inheritance'} %>
+
+<div class="tabs-panel marginbottom10">
+
+  <table width="100%">
+    <tr>
+      <td align="center"  valign="top">
+        <div>
+          <% @ancestors.reverse.each do |parent| %>
+            <a href="<%= url_for :action => 'inheritance', :id => parent.id() -%>"><%= parent.name() -%></a>
+            <span class="note">(<%= label_for_rules_count(parent, @all_profile_stats) -%>)</span><br/>
+            <%= image_tag 'blue-up.png' -%><br/>
+          <% end %>
+
+          <b><%= @profile.name -%></b> <span class="note">(<%= label_for_rules_count(@profile, @all_profile_stats) -%>)</span><br/>
+
+          <% if @children.size>0 %>
+            <%= image_tag 'blue-up.png' -%><br/>
+            <% @children.each_with_index do |child,index| %>
+              <%= ', ' if index>0 -%>
+              <a href="<%= url_for :action => 'inheritance', :id => child.id() -%>"><%= child.name() -%></a>
+              <span class="note">(<%= label_for_rules_count(child, @all_profile_stats) -%>)</span>
+            <% end %>
+            <br/><%= image_tag 'blue-up.png' -%><br/>
+            ...
+          <% end %>
+          </div>
+      </td>
+     <% if profiles_administrator? %>
+       <td valign="top" width="300">
+         <div class="admin">
+           <h3><%= message('quality_profiles.set_parent') -%>:</h3>
+           <p><%= message('quality_profiles.inherit_rules_from_profile') -%>:</p>
+           <% form_tag({:action => 'change_parent'}, {:method => 'post'}) do %>
+             <%= hidden_field_tag "id", @profile.id() %>
+             <%= select_tag "parent_id", options_for_select(@select_parent, (@parent.id() if @parent)) %>
+             <%= submit_tag message('change_verb'), :id => 'submit_parent'%>
+           <% end %>
+         </div>
+       </td>
+     <% end %>
+    </tr>
+  </table>
+
+</div>
+</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/new.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/new.html.erb
new file mode 100644 (file)
index 0000000..7706b78
--- /dev/null
@@ -0,0 +1,19 @@
+<h1><%= message('quality_profiles.new_profile') -%></h1>
+
+<% form_for(@profile) do |f| %>
+  <%= f.error_messages %>
+
+  <p>
+    <%= f.label :name %><br />
+    <%= f.text_field :name %>
+  </p>
+  <p>
+    <%= f.label :active %><br />
+    <%= f.check_box :active %>
+  </p>
+  <p>
+    <%= f.submit message('create') %>
+  </p>
+<% end %>
+
+<%= link_to message('back'), profiles_path %>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/permalinks.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/permalinks.html.erb
new file mode 100644 (file)
index 0000000..8eb4791
--- /dev/null
@@ -0,0 +1,39 @@
+<div class="page">
+  <header class="page-header">
+    <h1 class="page-title"><%= h @profile.name -%></h1>
+    <div class="page-description">
+      <a href="<%= ApplicationController.root_context -%>/old_profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
+    </div>
+  </header>
+
+<%= render :partial => 'old_profiles/tabs', :locals => {:selected_tab=>'Permalinks'} %>
+
+<div class="tabs-panel marginbottom10 ">
+       <% exporters = Internal.qprofile_exporters.exportersForLanguage(@profile.language()) %>
+       <br/>
+       <table class="data without-header marginbottom10" id="permalinks-table">
+      <tbody>
+         <tr class="even">
+           <td width="1%" nowrap>
+             <%= message('quality_profiles.export_all_rules') -%>
+           </td>
+           <td>
+             <% permalink = url_for :controller => 'old_profiles', :action => 'export', :language => @profile.language(), :name => url_encode(@profile.name()), :only_path => false %>
+             <span class="small"><%= link_to permalink, permalink %></span>
+           </td>
+         </tr>
+         <% exporters.to_a.sort{|x,y| x.getName() <=> y.getName()}.each do |exporter| %>
+           <tr class="<%= cycle('odd','even') -%>">
+             <td width="1%" nowrap>
+               <%= h exporter.getName() -%>
+             </td>
+             <td>
+               <% permalink=url_for :controller => 'old_profiles', :action => 'export', :language => @profile.language(), :name => url_encode(@profile.name()), :format => exporter.getKey(), :only_path => false %>
+               <span class="small"><%= link_to permalink, permalink, :id => "export_" + exporter.getKey().to_s + "_" + @profile.key() %></span>
+             </td>
+           </tr>
+         <% end %>
+         </tbody>
+       </table>
+</div>
+</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/projects.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/projects.html.erb
new file mode 100644 (file)
index 0000000..66467b6
--- /dev/null
@@ -0,0 +1,93 @@
+<div class="page">
+  <header class="page-header">
+    <h1 class="page-title"><%= h @profile.name -%></h1>
+    <div class="page-description">
+      <a href="<%= ApplicationController.root_context -%>/old_profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
+    </div>
+  </header>
+
+<%= render :partial => 'old_profiles/tabs', :locals => {:selected_tab => 'Projects'} %>
+
+<div class="tabs-panel">
+  <% if profiles_administrator? %>
+    <form method="POST" action="<%= ApplicationController.root_context -%>/old_profiles/add_project" id="add_project_form">
+      <input type="hidden" name="id" value="<%= @profile.id -%>"/>
+
+      Add project: <%= resource_select_tag 'project', {
+      :qualifiers => ['TRK'],
+      :width => '400px',
+      :html_id => "select-project",
+    } -%>
+      <script>$j('#select-project').on("change", function (e) {
+        $j(this).select2("disable");
+        $j('#add_project_form').submit();
+      })</script>
+    </form>
+
+    <% unless @projects.empty? %>
+      <table class="data" id="projects-table">
+        <thead>
+        <tr>
+          <th></th>
+          <th></th>
+        </tr>
+        </thead>
+        <tbody>
+        <% @projects.each do |project| %>
+          <tr class="<%= cycle('even', 'odd') -%>">
+            <td class="thin">
+              <%= link_to_action message('quality_profiles.remove_project_action'),
+                                 "#{ApplicationController.root_context}/old_profiles/remove_project?id=#{@profile.id}&project=#{project.id}",
+                                 :class => 'link-action',
+                                 :id => "link-remove-#{project.key.parameterize}",
+                                 :confirm_title => 'quality_profiles.remove_project_confirm_title',
+                                 :confirm_button => 'quality_profiles.remove_project_confirm_button',
+                                 :confirm_msg => 'quality_profiles.remove_project_confirm_message',
+                                 :confirm_msg_params => [project.name]
+              -%>
+            </td>
+            <td><%= h project.name -%> <span class="small gray"><%= h project.key -%></span></td>
+          </tr>
+        <% end %>
+        </tbody>
+        <tfoot>
+        <tr>
+          <td colspan="2">
+            <%= link_to_action message('quality_profiles.remove_projects_action'),
+                               "#{ApplicationController.root_context}/old_profiles/remove_projects?id=#{@profile.id}",
+                               :class => 'link-action',
+                               :id => "link-remove-projects",
+                               :confirm_title => 'quality_profiles.remove_projects_confirm_title',
+                               :confirm_button => 'quality_profiles.remove_projects_confirm_button',
+                               :confirm_msg => 'quality_profiles.remove_projects_confirm_message'
+            -%>
+          </td>
+        </tr>
+        </tfoot>
+      </table>
+    <% end %>
+  <% else %>
+
+    <% if @projects.empty? %>
+      <p><%= message('quality_profiles.no_projects_associated_to_profile_x', :params => @profile.name) -%></p>
+    <% else %>
+      <p><%= message('quality_profiles.projects_warning') -%></p>
+
+      <table class="data">
+        <thead>
+        <tr>
+          <th></th>
+        </tr>
+        </thead>
+        <tbody>
+        <% @projects.each do |project| %>
+          <tr class="<%= cycle('even', 'odd') -%>">
+            <td><%= h project.name -%> <span class="small gray"><%= h project.key -%></span></td>
+          </tr>
+        <% end %>
+        </tbody>
+      </table>
+    <% end %>
+  <% end %>
+</div>
+</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/show.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/old_profiles/show.html.erb
new file mode 100644 (file)
index 0000000..677e6bb
--- /dev/null
@@ -0,0 +1,80 @@
+<div class="page">
+  <header class="page-header">
+    <h1 class="page-title"><%= h @profile.name -%></h1>
+    <div class="page-description">
+      <a href="<%= ApplicationController.root_context -%>/old_profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
+    </div>
+  </header>
+
+  <%= render :partial => 'old_profiles/tabs', :locals => {:selected_tab=>'Rules'} %>
+
+  <div class="tabs-panel marginbottom10 ">
+    <% active_rules = @stats.get('countActiveRules').get(0).getValue() if @stats && @stats.get('countActiveRules') %>
+    <% active_rules ||= 0 %>
+
+    <div class="widget-span widget-span-3">
+      <div class="widget-measure-container">
+        <div class="widget-measure widget-measure-main">
+          <span class="widget-label"><%= message('rules') -%></span>
+          <span nowrap>
+            <% tooltip = message('quality_profiles.see_rules_tooltip')
+               tooltip = message('quality_profiles.manage_rules_tooltip') if profiles_administrator?
+            %>
+            <a class="widget-link"
+               href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{@profile.key()}|activation=true|languages=#{@profile.language()}" -%>"
+               title="<%= tooltip %>">
+              <span><%= active_rules -%></span>
+            </a>
+          </span>
+
+        </div>
+        <% if @deprecated_active_rules > 0 %>
+          <div class="widget-measure">
+            <%= message('quality_profiles.including') %>&nbsp;<a
+              href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{@profile.key()}|activation=true|languages=#{@profile.language()}|statuses=DEPRECATED" -%>"
+              ><%= @deprecated_active_rules -%></a>&nbsp;<%= message('quality_profiles.deprecated') %>
+          </div>
+        <% end %>
+      </div>
+    </div>
+
+    <% if @stats
+         severity_stats = @stats.get('severity')
+         severity_map = Hash[ *severity_stats.collect { |v| [ v.getKey(), v ] }.flatten ]
+
+         max = severity_stats.map { |val| val.getValue() }.max
+      %>
+      <div class="widget-span widget-span-3">
+        <div class="widget-measure-container">
+          <table class="data" style="width: 240px">
+            <tbody>
+            <% Severity::KEYS.each do |key|
+              stat = severity_map[key]
+              severity = key.downcase
+              value = 0
+              value = stat.getValue() if stat
+            -%>
+              <tr>
+                <td>
+                  <i class="icon-severity-<%= severity %>"></i> <%= message(severity) -%>
+                </td>
+                <td class="thin text-right">
+                  <a href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{@profile.key()}|activation=true|languages=#{@profile.language()}|active_severities=#{severity.upcase}" -%>"
+                    class="widget-link">
+                    <span><%= value -%></span>
+                  </a>
+                </td>
+                <td class="nowrap ">
+                  <% if max > 0 %>
+                    <%= barchart(:width => 70, :percent => (100 * value / max).to_i) %>
+                  <% end %>
+                </td>
+              </tr>
+            <% end -%>
+            </tbody>
+          </table>
+        </div>
+      </div>
+    <% end -%>
+  </div>
+</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_copy_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_copy_form.html.erb
deleted file mode 100644 (file)
index 71520b0..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<form id="copy-profile-form" method="post" action="profiles/copy">
-  <input type="hidden" name="id" value="<%= @profile.id -%>"/>
-  <fieldset>
-    <div class="modal-head">
-      <h2> <%= message('quality_profiles.copy_x_title', :params => [h @profile.name]) -%></h2>
-    </div>
-    <div class="modal-body">
-      <div class="modal-error"/>
-      <div class="modal-warning"/>
-      <div class="modal-field">
-        <label for="name"><%= message 'quality_profiles.copy_new_name' -%> <em class="mandatory">*</em></label>
-        <input id="copy-name" name="name" type="text" size="50" maxlength="100" autofocus="autofocus"/>
-      </div>
-    </div>
-    <div class="modal-foot">
-      <input type="hidden" value="" name="overwrite" id="copy-overwrite"/>
-      <input type="submit" value="<%= h message('copy') -%>" id="copy-submit"/>
-      <a href="#" onclick="return closeModalWindow()" id="copy-cancel"><%= h message('cancel') -%></a>
-    </div>
-  </fieldset>
-</form>
-<script>
-  $j("#copy-profile-form").modalForm({
-    error: function (xhr) {
-      if (xhr.status == 409) {
-        $j('#copy-profile-form .modal-error').hide();
-        var warningElt = $j('#copy-profile-form .modal-warning');
-        $j('#copy-overwrite').val($j('#copy-name').val());
-        $j('#copy-profile-form input[type=submit]').removeAttr('disabled');
-        warningElt.html(xhr.responseText);
-        warningElt.show();
-      } else {
-        $j('#copy-profile-form .modal-warning').hide();
-        var errorElt = $j('#copy-profile-form .modal-error');
-        $j('.loading-image').addClass("hidden");
-        $j('#copy-profile-form input[type=submit]').removeAttr('disabled');
-        errorElt.html(xhr.responseText);
-        errorElt.show();
-      }
-    }
-  });
-</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_create_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_create_form.html.erb
deleted file mode 100644 (file)
index a003c05..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<%
-   language = controller.java_facade.getLanguages().find { |l| l.getKey()==language_key }
-   importers = Internal.component(Java::OrgSonarServerQualityprofile::QProfileExporters.java_class).findProfileImportersForLanguage(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="modal-head">
-      <h2><%= h message('quality_profiles.create_x_language_profile', :params => language.getName()) -%></h2>
-    </div>
-
-    <div class="modal-body">
-
-      <div class="modal-field">
-        <label for="name"><%= message('name') -%> <em class="mandatory">*</em></label>
-        <input id="create-profile-name" name="name" type="text" size="50" maxlength="100" autofocus="autofocus"/>
-      </div>
-
-      <% importers.to_a.sort { |x, y| x.getName() <=> y.getName() }.each do |importer| %>
-        <div class="modal-field">
-          <label for="backup[<%= importer.getKey() -%>]"><%= h importer.getName() -%></label>
-          <%= file_field_tag "backup[#{importer.getKey()}]" %>
-          <div class="modal-field-description"><%= h message('quality_profiles.optional_configuration_file') -%></div>
-        </div>
-      <% end %>
-    </div>
-
-    <div class="modal-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>
-
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_diff_rule.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_diff_rule.html.erb
deleted file mode 100644 (file)
index 36ae86f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<i class="icon-severity-<%= arule.priority -%>"></i>
-
-<a href="<%= url_for :controller => 'coding_rules', :action => 'index', :anchor => 'rule_key=' + arule.rule.key + '|qprofile=' + aprofile.kee -%>">
-  <%= h(arule.rule.name) -%>
-</a>
-<span class="note"><%= h(arule.rule.plugin_name) -%></span>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_new.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_new.html.erb
deleted file mode 100644 (file)
index 529fae5..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<div class="admin">
-<% form_tag({:action => 'create'}, {:multipart => true, :id => 'form_create_profile'}) do -%>
-  <table class="spaced">
-    <tr>
-      <td align="left" nowrap="nowrap" width="1%">
-        <%= message('name') -%>
-      </td>
-      <td align="left">
-        <input type="text" name="name"/>
-      </td>
-    </tr>
-    <tr>
-      <td align="left" nowrap="nowrap">
-        <%= message('language') -%>
-      </td>
-      <td align="left">
-        <% languages_select=languages.collect do |language|
-              [language.getName(), language.getKey()]
-           end
-       %>
-        <%= select_tag :language, options_for_select(languages_select), :onClick => 'changeLanguage();' %>
-      </td>
-    </tr>
-  </table>
-
-  <% languages.each do |language| %>
-    <% if @plugins_by_language[language.getKey()] %>
-    <table class="spaced language_class" id="<%= language.getKey() %>" style="display:none">
-      <% @plugins_by_language[language.getKey()].each do |plugin| %>
-      <tr>
-        <td align="left" style="vertical-align: top;"  nowrap="nowrap" width="1%">
-          <%= image_tag'bullet.png' %> <%= plugin.getName() %> XML (<%= message('optional').downcase -%>)
-        </td>
-        <td align="left">
-          <%= file_field_tag plugin.getKey() %>
-        </td>
-      </tr>
-      <% end %>
-    </table>
-    <% end %>
-  <% end %>
-
-  <table class="spaced">
-    <tr>
-      <td colspan="2" align="left">
-        <%= submit_tag message('create') %>
-        <a href="<%= url_for :controller => 'profiles', :action => 'index' -%>" class="action"><%= message('cancel') -%></a>
-      </td>
-    </tr>
-  </table>
-<% end %>
-</div>
-
-<script type="text/javascript">
-    changeLanguage();
-</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_rename_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_rename_form.html.erb
deleted file mode 100644 (file)
index cf0f905..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-<form id="rename-profile-form" method="post" action="profiles/rename">
-  <input type="hidden" name="id" value="<%= @profile.id -%>"/>
-  <fieldset>
-
-    <div class="modal-head">
-      <h2>Rename Profile: <%= h @profile.name -%></h2>
-    </div>
-
-    <div class="modal-body">
-      <div class="modal-error"/>
-
-      <div class="modal-field">
-        <label for="new_name">New name <em class="mandatory">*</em></label>
-        <input id="new-name" name="new_name" type="text" size="50" maxlength="100" autofocus="autofocus"/>
-      </div>
-    </div>
-    <div class="modal-foot">
-      <input type="submit" value="<%= h message('rename') -%>" id="rename-submit"/>
-      <a href="#" onclick="return closeModalWindow()" id="rename-cancel"><%= h message('cancel') -%></a>
-    </div>
-  </fieldset>
-</form>
-<script>
-  $j("#rename-profile-form").modalForm();
-</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_restore_built_in_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_restore_built_in_form.html.erb
deleted file mode 100644 (file)
index b483ce1..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<form id="restore-built-in-profiles-form" action="profiles/restore_built_in" method="POST">
-  <fieldset>
-    <input type="hidden" name="language" value="<%= @language.getKey() -%>"/>
-
-    <div class="modal-head">
-      <h2><%= h message('quality_profiles.restore_built_in_profiles') -%></h2>
-    </div>
-
-    <div class="modal-body">
-      <%= h message('quality_profiles.restore_built_in_profiles_confirmation', :params => [@builtin_profile_names.join('\', \''), @language.getName()]) -%>
-    </div>
-
-    <div class="modal-foot">
-      <input type="submit" value="<%= h message('restore') -%>" id="restore-built-in-profiles-submit"/>
-      <a href="#" onclick="return closeModalWindow()" id="restore-built-in-profiles-cancel"><%= h message('cancel') -%></a>
-    </div>
-  </fieldset>
-</form>
-<script>
-  $j("#restore-built-in-profiles-form").modalForm();
-</script>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_restore_form.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_restore_form.html.erb
deleted file mode 100644 (file)
index 8fcae13..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<form id="restore-profile-form" action="profiles/restore" enctype="multipart/form-data" method="POST">
-  <fieldset>
-
-    <div class="modal-head">
-      <h2><%= h message('quality_profiles.restore_built_in_profiles') -%></h2>
-    </div>
-
-    <div class="modal-body">
-      <div class="modal-field">
-        <label for="name"><%= message('backup') -%> <em class="mandatory">*</em></label>
-        <%= file_field_tag 'backup' %>
-      </div>
-
-    </div>
-
-    <div class="modal-foot">
-      <input type="submit" value="<%= h message('quality_profiles.restore_submit') -%>" id="restore-profile-submit"/>
-      <a href="#" onclick="return closeModalWindow()" id="restore-profile-cancel"><%= h message('cancel') -%></a>
-    </div>
-  </fieldset>
-</form>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_tabs.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/_tabs.html.erb
deleted file mode 100644 (file)
index d11fd39..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<%
-  new_tab = nil unless defined?(:new_tab)
-  selected_tab = nil unless defined?(:selected_tab)
-%>
-<ul class="tabs">
-  <li>
-    <a href="<%= url_for :controller => 'profiles', :action => 'show', :key => @profile.key() -%>" <%= "class='selected'" if selected_tab.nil? || selected_tab=='Rules' -%> id="tab-rules"><%= message('coding_rules') -%></a>
-  </li>
-  <li>
-    <a href="<%= url_for :controller => 'profiles', :action => 'projects', :id => @profile.id -%>" <%= "class='selected'" if selected_tab=='Projects' -%> id="tab-projects"><%= message('projects') -%></a>
-  </li>
-  <li>
-    <a href="<%= url_for :controller => 'profiles', :action => 'permalinks', :id => @profile.id -%>" <%= "class='selected'" if selected_tab=='Permalinks' -%> id="tab-permalinks"><%= message('permalinks') -%></a>
-  </li>
-  <li>
-    <a href="<%= url_for :controller => 'profiles', :action => 'inheritance', :id => @profile.id -%>" <%= "class='selected'" if selected_tab=='inheritance' -%> id="tab-inheritance"><%= message('quality_profiles.profile_inheritance') -%></a>
-  </li>
-  <li>
-    <a href="<%= url_for :controller => 'profiles', :action => 'changelog', :key => @profile.key() -%>" <%= "class='selected'" if selected_tab=='changelog' -%> id="tab-changelog"><%= message('changelog') -%></a>
-  </li>
-  <% if new_tab %>
-  <li>
-    <a href="#" class='selected'><%= new_tab -%></a>
-  </li>
-  <% end %>
-</ul>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/changelog.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/changelog.html.erb
deleted file mode 100644 (file)
index f807ae7..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<div class="page">
-  <header class="page-header">
-    <h1 class="page-title"><%= h @profile.name -%></h1>
-    <div class="page-description">
-      <a href="<%= ApplicationController.root_context -%>/profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
-    </div>
-  </header>
-<%= render :partial => 'profiles/tabs', :locals => {:selected_tab=>'changelog'} %>
-
-<div class="tabs-panel marginbottom10">
-  <form class="marginbottom10" method="get" action="<%= ApplicationController.root_context %>/profiles/changelog">
-    <input name="key" type="hidden" value="<%= @profile.key() %>"/>
-    <%= message('quality_profiles.changelog_from') -%>
-    <input name="since" type="text" value="<%= params['since'] %>" placeholder="1970-01-31"/>
-    <%= message('to').downcase -%>
-    <input name="to" type="text" value="<%= params['to'] %>" placeholder="1970-01-31"/>
-    <input type="submit" value="<%= h message('search_verb') -%>" id="submit"/>
-  </form>
-
-  <% if @changes.empty? %>
-    <%= message('quality_profiles.changelog.empty') -%>
-  <% else %>
-
-    <table id="profile-changelog" class="data width100">
-      <thead>
-        <tr>
-          <th><%= message('date') -%></th>
-          <th><%= message('user') -%></th>
-          <th><%= message('action') -%></th>
-          <th><%= message('rule') -%></th>
-          <th><%= message('parameters') -%></th>
-        </tr>
-      </thead>
-      <tbody>
-        <%
-          @changes.each do |change|
-        %>
-        <tr class="<%= cycle('even', 'odd') -%>">
-          <%
-             action = change.getAction()
-             action_message = message('quality_profiles.changelog.' + action.downcase) if action
-
-             if change.authorName() && !change.authorName().empty?()
-               author = change.authorName()
-             elsif change.login() && !change.getLogin().empty?()
-               author = change.getLogin()
-             else
-               author = 'System'
-             end
-             rule = change.ruleName() ? change.ruleName() : change.ruleKey()
-          %>
-          <td valign="top" width="1%" nowrap><%= Internal.i18n.formatDateTime(change.getCreatedAt()) -%></td>
-          <td valign="top" width="1%" nowrap><%= author %></td>
-          <td valign="top" width="1%" nowrap><%= action_message %></td>
-          <td valign="top"><%= rule %></td>
-          <td valign="top">
-            <% if change.severity() %>
-              <%= message('quality_profiles.severity_set_to_x', :params => ["<i class=\"icon-severity-#{change.severity().downcase}\"></i>", change.severity()]) -%>
-              <br/>
-            <% end %>
-            <% change.parameters().each do |param_key, param_value| %>
-              <% unless param_value.empty? %>
-                <%= message('quality_profiles.parameter_set_to_x', :params => [param_key, param_value]) -%>
-              <% else %>
-                <%= message('quality_profiles.changelog.parameter_reset_to_default_value_x', :params => [param_key]) -%>
-              <% end %>
-              <br/>
-            <% end %>
-          </td>
-        </tr>
-        <% end %>
-      </tbody>
-      <%= paginate_java(@paging, :colspan => 5, :include_loading_icon => true) { |label, page_id|
-        link_to(label, params.merge({:p => page_id}), :style => 'text-decoration:underline')
-      }
-      %>
-    </table>
-
-  <% end %>
-</div>
-</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/compare.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/compare.html.erb
deleted file mode 100644 (file)
index 5405182..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-<div class="page">
-  <header class="page-header">
-    <h1 class="page-title"><%= h message('quality_profiles.compare_profiles') -%></h1>
-    <div class="page-description">
-      <a href="<%= ApplicationController.root_context -%>/profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
-    </div>
-  </header>
-
-<form method="GET" class="marginbottom10">
-  <select name="id1" class="small">
-    <option value=""></option>
-    <%= options_for_profiles(@profiles, @id1) %>
-  </select>
-
-  <select name="id2" class="small">
-    <option value=""></option>
-    <%= options_for_profiles(@profiles, @id2) %>
-  </select>
-  <input type="submit" value="<%= message('compare') -%>" class="small" id="submit-compare"/>
-</form>
-
-<% if @profile1 && @profile2 %>
-
-  <table class="header1" id="comparison-header">
-    <tr>
-      <td width="25%">
-        <p><%= message('quality_profiles.only_in_profile_x', :params => h(@profile1.name)) -%></p>
-        <span class="big"><a href="#in1" id="in1Value"><%= @in1.size -%></a></span> <%= message('rules').downcase -%>
-      </td>
-      <td width="25%">
-        <p><%= message('quality_profiles.only_in_profile_x', :params => h(@profile2.name)) -%></p>
-        <span class="big"><a href="#in2" id="in2Value"><%= @in2.size -%></a></span> <%= message('rules').downcase -%>
-      </td>
-      <td width="25%">
-        <p><%= message('quality_profiles.with_different_configuration') -%></p>
-        <span class="big"><a href="#modified" id="modifiedValue"><%= @modified.size -%></a></span> <%= message('rules').downcase -%>
-      </td>
-      <td width="25%">
-        <p><%= message('quality_profiles.with_same_configuration') -%></p>
-        <span class="big" id="sameValue"><%= @sames.size -%></span> <%= message('rules').downcase -%>
-      </td>
-    </tr>
-  </table>
-
-  <table class="width100 marginbottom10" id="profile_diff_table">
-    <tbody>
-
-    <% unless @in1.empty? %>
-      <tr>
-        <td width="49%">
-          <table class="data width100 marginbottom10" id="in1-rules">
-            <thead>
-            <tr>
-              <th><a name="in1"/><%= message('quality_profiles.x_rules_only_in', :params => @in1.size) %>
-                <a href="<%= url_for :controller => 'profiles', :action => 'show', :key => @profile1.kee -%>"><%= h @profile1.name %></a>
-              </th>
-            </tr>
-            </thead>
-            <% @in1.each do |diff| %>
-              <tr id="rule_<%= u(diff.rule.key) -%>">
-                <td class="<%= cycle('even', 'odd', :name => 'in1') -%>">
-                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule1, :aprofile => @profile1} %>
-                </td>
-              </tr>
-            <% end %>
-          </table>
-        </td>
-        <td width="2%"></td>
-        <td width="49%"></td>
-      </tr>
-    <% end %>
-
-    <% unless @in2.empty? %>
-      <tr>
-        <td width="49%"></td>
-        <td width="2%"></td>
-        <td width="49%">
-          <table class="data width100 marginbottom10" id="in2-rules">
-            <thead>
-            <tr>
-              <th><a name="in2"/><%= message('quality_profiles.x_rules_only_in', :params => @in2.size) %>
-                <a href="<%= url_for :controller => 'profiles', :action => 'show', :key => @profile2.kee -%>"><%= h @profile2.name %></a>
-              </th>
-            </tr>
-            </thead>
-            <% @in2.each do |diff| %>
-              <tr id="rule_<%= u(diff.rule.key) -%>">
-                <td class="<%= cycle('even', 'odd', :name => 'in2') -%>">
-                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule2, :aprofile => @profile2} %>
-                </td>
-              </tr>
-            <% end %>
-          </table>
-        </td>
-      </tr>
-    <% end %>
-
-
-    <% unless @modified.empty? %>
-      <tr>
-        <td colspan="3">
-          <table class="data width100 marginbottom10" id="modified-rules">
-            <thead>
-            <tr>
-              <th width="49%"><a name="modified"/><%= message('quality_profiles.x_rules_have_different_configuration', :params =>@modified.size) -%><br/>
-                <a href="<%= url_for :controller => 'profiles', :action => 'show', :key => @profile1.kee -%>"><%= h @profile1.name %></a>
-              </th>
-              <th width="2%"></th>
-              <th width="49%">
-                <br/><a href="<%= url_for :controller => 'profiles', :action => 'show', :key => @profile2.kee -%>"><%= h @profile2.name %></a>
-              </th>
-            </tr>
-            </thead>
-            <% @modified.each do |diff|
-              td_css=cycle('even', 'odd', :name => 'modified')
-            %>
-              <tr id="rule_<%= u(diff.rule.key) -%>">
-                <td class="<%= td_css -%>" width="49%">
-                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule1, :aprofile => @profile1} %>
-                  <% if diff.removed_params && !diff.removed_params.empty? %>
-                    <ul>
-                      <% diff.removed_params.each do |parameter| %>
-                        <li><%= h(parameter.name) -%>:
-                          <span class="diffParam"><%= parameter.value.gsub(',', ', ') -%></span></li>
-                      <% end %>
-                    </ul>
-                  <% end %>
-                </td>
-                <td width="2%" class="<%= td_css -%>"></td>
-                <td class="<%= td_css -%>" width="49%">
-                  <%= render :partial => 'diff_rule', :locals => {:arule => diff.arule2, :aprofile => @profile2} %>
-                  <% if diff.added_params && !diff.added_params.empty? %>
-                    <ul>
-                      <% diff.added_params.each do |parameter| %>
-                        <li><%= h(parameter.name) -%>:
-                          <span class="diffParam"><%= parameter.value.gsub(',', ', ') -%></span></li>
-                      <% end %>
-                    </ul>
-                  <% end %>
-                </td>
-              </tr>
-            <% end %>
-          </table>
-        </td>
-      </tr>
-    <% end %>
-    </tbody>
-  </table>
-<% end %>
-</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/edit.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/edit.html.erb
deleted file mode 100644 (file)
index b96cabb..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<h1>message('quality_profiles.editing_profile')</h1>
-
-<% form_for(@profile) do |f| %>
-  <%= f.error_messages %>
-
-  <p>
-    <%= f.label :name %><br />
-    <%= f.text_field :name %>
-  </p>
-  <p>
-    <%= f.label :active %><br />
-    <%= f.check_box :active %>
-  </p>
-  <p>
-    <%= f.submit message('update_verb') %>
-  </p>
-<% end %>
-
-<%= link_to message('show_verb'), @profile %> |
-<%= link_to message('back'), profiles_path %>
index 9c8488a883587dead2366e87db89345a63881204..3084e764ef18d33099275a8606952baf4b87a8d0 100644 (file)
@@ -1,133 +1,5 @@
-<div class="page">
-
-  <div class="page-header">
-    <h1 class="page-title"><%= h message('quality_profiles.page') -%></h1>
-
-    <div class="page-actions">
-      <div class="button-group">
-        <a href="profiles/compare" id="compare-link" class="button"><i class="icon-compare"></i> <%= message('quality_profiles.compare_profiles') -%>
-        </a>
-        <% if profiles_administrator? %>
-          <a href="profiles/restore_form" class="open-modal button" id="restore-link"><i class="icon-restore"></i> <%= message('quality_profiles.restore_profile') -%>
-          </a>
-        <% end %>
-      </div>
-    </div>
-  </div>
-
-<%
-   Api::Utils.insensitive_sort(languages){|l| l.getName()}.each do |language|
-      default_profile = Internal.component(Java::OrgSonarServerQualityprofile::QProfileService.java_class).getDefault(language.getKey())
-%>
-  <div class="line-block">
-    <% if profiles_administrator? %>
-      <ul style="float: right" class="horizontal">
-        <li class="marginleft10">
-          <i class="icon-plus"></i>
-          <a id="create-link-<%= language.getKey() -%>" href="<%= ApplicationController.root_context -%>/profiles/create_form?language=<%= u language.getKey() -%>"
-             class="open-modal link-action"><%= message('create') -%></a>
-        </li>
-      </ul>
-      <ul style="float: right" class="horizontal">
-        <li class="marginleft10">
-          <a id="create-link-<%= language.getKey() -%>" href="<%= ApplicationController.root_context -%>/profiles/restore_built_in_form?language=<%= u language.getKey() -%>"
-             class="open-modal link-action"><%= message('quality_profiles.restore_built_in_profiles') -%></a>
-        </li>
-      </ul>
-    <% end %>
-    <h2><%= message('quality_profiles.x_language_profiles', :params => language.getName()) -%></h2>
-  </div>
-
-  <table class="data width100" id="profiles_<%= language.getKey() -%>">
-    <thead>
-    <tr>
-      <th class="text-left"><%= message('name') -%></th>
-      <th class="text-right"><%= message('rules') -%></th>
-      <th class="text-right"><%= message('projects') -%></th>
-      <th class="text-right"><%= message('default') -%></th>
-      <% if profiles_administrator? %>
-        <th width="1%" class="text-right" colspan="4"><%= message('operations') -%></th>
-      <% end %>
-    </tr>
-    </thead>
-    <tbody>
-    <% @profiles.select { |p| p.language == language.getKey() }.each do |profile|
-       projects_count = projects_count(profile)
-       is_default_profile = default_profile && default_profile.key()==profile.key()
-    %>
-      <tr class="<%= cycle 'even', 'odd', :name => language.getKey() -%> hoverable" id="<%= u profile.key() %>">
-        <td  width="40%">
-          <a href="<%= url_for :controller => 'profiles', :action => 'show', :key => profile.key() -%>"
-             id="rules-<%= profile.key() -%>"><%= h profile.name() -%></a>
-        </td>
-
-        <td align="right" width="10%">
-          <%
-             rules_tooltip = message('quality_profiles.see_rules_tooltip_x_profile', :params => [profile.name()])
-             rules_tooltip = message('quality_profiles.manage_rules_tooltip_x_profile', :params => [profile.name()]) if profiles_administrator?
-          %>
-          <a class="widget-link"
-             href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{profile.key()}|activation=true|languages=#{profile.language()}" -%>"
-             title="<%= rules_tooltip %>">
-            <span id="activated_rules_<%= u profile.key() -%>">
-            <%= @active_rule_counts[profile.key()] || 0 -%>
-          </span>
-          </a>
-        </td>
-
-        <td align="right" width="10%" nowrap>
-          <% unless is_default_profile %>
-            <span id="projects_<%= u profile.key() -%>"><%= projects_count -%></span>
-          <% end %>
-        </td>
-
-        <td align="right" width="10%" nowrap>
-          <% if !is_default_profile && profiles_administrator? %>
-            <%= link_to_action message('set_as_default'), "#{ApplicationController.root_context}/profiles/set_as_default?id=#{profile.id()}",
-                               :id => "activate_#{profile.key().parameterize}",
-                               :class => 'link-action',
-                               :confirm_title => message('set_as_default'),
-                               :confirm_msg => message('quality_profiles.are_you_sure_want_x_profile_as_default', :params => [profile.name()]),
-                               :confirm_button => message('set_as_default')
-            -%>
-          <% end %>
-          <% if is_default_profile %>
-            <i class="icon-check" id='<%= "is_active_#{u profile.key()}" -%>'></i>
-          <% end %>
-        </td>
-
-        <td align="right" nowrap>
-          <form method="post" action="<%= ApplicationController.root_context -%>/profiles/backup" id="backup-<%= profile.key().parameterize -%>-form">
-            <input type="hidden" name="key" value="<%= profile.key() -%>"/>
-            <a href="#" class="link-action" name="button_backup" id="backup_<%= u profile.key() -%>" onclick="$j('#backup-<%= profile.key().parameterize -%>-form').submit();return false;"><%= message('backup_verb') -%></a>
-          </form>
-        </td>
-        <% if profiles_administrator? %>
-          <td align="right">
-            <a id="rename-<%= profile.key().parameterize -%>" href="<%= ApplicationController.root_context -%>/profiles/rename_form/<%= profile.id() -%>" class="link-action open-modal"><%= message('rename') -%></a>
-          </td>
-
-          <td align="right">
-            <a id="copy-<%= profile.key().parameterize -%>" href="<%= ApplicationController.root_context -%>/profiles/copy_form/<%= profile.id() -%>" class="link-action open-modal"><%= message('copy') -%></a>
-          </td>
-
-          <td>
-            <% if !is_default_profile %>
-              <%= link_to_action message('delete'), "#{ApplicationController.root_context}/profiles/delete/#{profile.id()}",
-                                 :class => 'link-action link-red',
-                                 :id => "delete_#{profile.key().parameterize}",
-                                 :confirm_button => message('delete'),
-                                 :confirm_title => 'quality_profiles.delete_confirm_title',
-                                 :confirm_msg => 'quality_profiles.are_you_sure_want_delete_profile_x_and_descendants',
-                                 :confirm_msg_params => [profile.name()]
-              -%>
-            <% end %>
-          </td>
-        <% end %>
-      </tr>
-    <% end %>
-    </tbody>
-  </table>
-  <br/><br/>
+<% content_for :script do %>
+  <script>require(['quality-profiles/app']);</script>
 <% end %>
-</div>
+
+<div class="search-navigator" id="quality-profiles"></div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/inheritance.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/inheritance.html.erb
deleted file mode 100644 (file)
index bb97f91..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<div class="page">
-  <header class="page-header">
-    <h1 class="page-title"><%= h @profile.name -%></h1>
-    <div class="page-description">
-      <a href="<%= ApplicationController.root_context -%>/profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
-    </div>
-  </header>
-
-<%= render :partial => 'profiles/tabs', :locals => {:selected_tab=>'inheritance'} %>
-
-<div class="tabs-panel marginbottom10">
-
-  <table width="100%">
-    <tr>
-      <td align="center"  valign="top">
-        <div>
-          <% @ancestors.reverse.each do |parent| %>
-            <a href="<%= url_for :action => 'inheritance', :id => parent.id() -%>"><%= parent.name() -%></a>
-            <span class="note">(<%= label_for_rules_count(parent, @all_profile_stats) -%>)</span><br/>
-            <%= image_tag 'blue-up.png' -%><br/>
-          <% end %>
-
-          <b><%= @profile.name -%></b> <span class="note">(<%= label_for_rules_count(@profile, @all_profile_stats) -%>)</span><br/>
-
-          <% if @children.size>0 %>
-            <%= image_tag 'blue-up.png' -%><br/>
-            <% @children.each_with_index do |child,index| %>
-              <%= ', ' if index>0 -%>
-              <a href="<%= url_for :action => 'inheritance', :id => child.id() -%>"><%= child.name() -%></a>
-              <span class="note">(<%= label_for_rules_count(child, @all_profile_stats) -%>)</span>
-            <% end %>
-            <br/><%= image_tag 'blue-up.png' -%><br/>
-            ...
-          <% end %>
-          </div>
-      </td>
-     <% if profiles_administrator? %>
-       <td valign="top" width="300">
-         <div class="admin">
-           <h3><%= message('quality_profiles.set_parent') -%>:</h3>
-           <p><%= message('quality_profiles.inherit_rules_from_profile') -%>:</p>
-           <% form_tag({:action => 'change_parent'}, {:method => 'post'}) do %>
-             <%= hidden_field_tag "id", @profile.id() %>
-             <%= select_tag "parent_id", options_for_select(@select_parent, (@parent.id() if @parent)) %>
-             <%= submit_tag message('change_verb'), :id => 'submit_parent'%>
-           <% end %>
-         </div>
-       </td>
-     <% end %>
-    </tr>
-  </table>
-
-</div>
-</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/new.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/new.html.erb
deleted file mode 100644 (file)
index 7706b78..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<h1><%= message('quality_profiles.new_profile') -%></h1>
-
-<% form_for(@profile) do |f| %>
-  <%= f.error_messages %>
-
-  <p>
-    <%= f.label :name %><br />
-    <%= f.text_field :name %>
-  </p>
-  <p>
-    <%= f.label :active %><br />
-    <%= f.check_box :active %>
-  </p>
-  <p>
-    <%= f.submit message('create') %>
-  </p>
-<% end %>
-
-<%= link_to message('back'), profiles_path %>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/permalinks.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/permalinks.html.erb
deleted file mode 100644 (file)
index 1115c25..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-<div class="page">
-  <header class="page-header">
-    <h1 class="page-title"><%= h @profile.name -%></h1>
-    <div class="page-description">
-      <a href="<%= ApplicationController.root_context -%>/profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
-    </div>
-  </header>
-
-<%= render :partial => 'profiles/tabs', :locals => {:selected_tab=>'Permalinks'} %>
-
-<div class="tabs-panel marginbottom10 ">
-       <% exporters = Internal.qprofile_exporters.exportersForLanguage(@profile.language()) %>
-       <br/>
-       <table class="data without-header marginbottom10" id="permalinks-table">
-      <tbody>
-         <tr class="even">
-           <td width="1%" nowrap>
-             <%= message('quality_profiles.export_all_rules') -%>
-           </td>
-           <td>
-             <% permalink = url_for :controller => 'profiles', :action => 'export', :language => @profile.language(), :name => url_encode(@profile.name()), :only_path => false %>
-             <span class="small"><%= link_to permalink, permalink %></span>
-           </td>
-         </tr>
-         <% exporters.to_a.sort{|x,y| x.getName() <=> y.getName()}.each do |exporter| %>
-           <tr class="<%= cycle('odd','even') -%>">
-             <td width="1%" nowrap>
-               <%= h exporter.getName() -%>
-             </td>
-             <td>
-               <% permalink=url_for :controller => 'profiles', :action => 'export', :language => @profile.language(), :name => url_encode(@profile.name()), :format => exporter.getKey(), :only_path => false %>
-               <span class="small"><%= link_to permalink, permalink, :id => "export_" + exporter.getKey().to_s + "_" + @profile.key() %></span>
-             </td>
-           </tr>
-         <% end %>
-         </tbody>
-       </table>
-</div>
-</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/projects.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/projects.html.erb
deleted file mode 100644 (file)
index 063c900..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-<div class="page">
-  <header class="page-header">
-    <h1 class="page-title"><%= h @profile.name -%></h1>
-    <div class="page-description">
-      <a href="<%= ApplicationController.root_context -%>/profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
-    </div>
-  </header>
-
-<%= render :partial => 'profiles/tabs', :locals => {:selected_tab => 'Projects'} %>
-
-<div class="tabs-panel">
-  <% if profiles_administrator? %>
-    <form method="POST" action="<%= ApplicationController.root_context -%>/profiles/add_project" id="add_project_form">
-      <input type="hidden" name="id" value="<%= @profile.id -%>"/>
-
-      Add project: <%= resource_select_tag 'project', {
-      :qualifiers => ['TRK'],
-      :width => '400px',
-      :html_id => "select-project",
-    } -%>
-      <script>$j('#select-project').on("change", function (e) {
-        $j(this).select2("disable");
-        $j('#add_project_form').submit();
-      })</script>
-    </form>
-
-    <% unless @projects.empty? %>
-      <table class="data" id="projects-table">
-        <thead>
-        <tr>
-          <th></th>
-          <th></th>
-        </tr>
-        </thead>
-        <tbody>
-        <% @projects.each do |project| %>
-          <tr class="<%= cycle('even', 'odd') -%>">
-            <td class="thin">
-              <%= link_to_action message('quality_profiles.remove_project_action'),
-                                 "#{ApplicationController.root_context}/profiles/remove_project?id=#{@profile.id}&project=#{project.id}",
-                                 :class => 'link-action',
-                                 :id => "link-remove-#{project.key.parameterize}",
-                                 :confirm_title => 'quality_profiles.remove_project_confirm_title',
-                                 :confirm_button => 'quality_profiles.remove_project_confirm_button',
-                                 :confirm_msg => 'quality_profiles.remove_project_confirm_message',
-                                 :confirm_msg_params => [project.name]
-              -%>
-            </td>
-            <td><%= h project.name -%> <span class="small gray"><%= h project.key -%></span></td>
-          </tr>
-        <% end %>
-        </tbody>
-        <tfoot>
-        <tr>
-          <td colspan="2">
-            <%= link_to_action message('quality_profiles.remove_projects_action'),
-                               "#{ApplicationController.root_context}/profiles/remove_projects?id=#{@profile.id}",
-                               :class => 'link-action',
-                               :id => "link-remove-projects",
-                               :confirm_title => 'quality_profiles.remove_projects_confirm_title',
-                               :confirm_button => 'quality_profiles.remove_projects_confirm_button',
-                               :confirm_msg => 'quality_profiles.remove_projects_confirm_message'
-            -%>
-          </td>
-        </tr>
-        </tfoot>
-      </table>
-    <% end %>
-  <% else %>
-
-    <% if @projects.empty? %>
-      <p><%= message('quality_profiles.no_projects_associated_to_profile_x', :params => @profile.name) -%></p>
-    <% else %>
-      <p><%= message('quality_profiles.projects_warning') -%></p>
-
-      <table class="data">
-        <thead>
-        <tr>
-          <th></th>
-        </tr>
-        </thead>
-        <tbody>
-        <% @projects.each do |project| %>
-          <tr class="<%= cycle('even', 'odd') -%>">
-            <td><%= h project.name -%> <span class="small gray"><%= h project.key -%></span></td>
-          </tr>
-        <% end %>
-        </tbody>
-      </table>
-    <% end %>
-  <% end %>
-</div>
-</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/show.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/profiles/show.html.erb
deleted file mode 100644 (file)
index f7fe266..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<div class="page">
-  <header class="page-header">
-    <h1 class="page-title"><%= h @profile.name -%></h1>
-    <div class="page-description">
-      <a href="<%= ApplicationController.root_context -%>/profiles">&larr;&nbsp;<%= h message('quality_profiles.page') -%></a>
-    </div>
-  </header>
-
-  <%= render :partial => 'profiles/tabs', :locals => {:selected_tab=>'Rules'} %>
-
-  <div class="tabs-panel marginbottom10 ">
-    <% active_rules = @stats.get('countActiveRules').get(0).getValue() if @stats && @stats.get('countActiveRules') %>
-    <% active_rules ||= 0 %>
-
-    <div class="widget-span widget-span-3">
-      <div class="widget-measure-container">
-        <div class="widget-measure widget-measure-main">
-          <span class="widget-label"><%= message('rules') -%></span>
-          <span nowrap>
-            <% tooltip = message('quality_profiles.see_rules_tooltip')
-               tooltip = message('quality_profiles.manage_rules_tooltip') if profiles_administrator?
-            %>
-            <a class="widget-link"
-               href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{@profile.key()}|activation=true|languages=#{@profile.language()}" -%>"
-               title="<%= tooltip %>">
-              <span><%= active_rules -%></span>
-            </a>
-          </span>
-
-        </div>
-        <% if @deprecated_active_rules > 0 %>
-          <div class="widget-measure">
-            <%= message('quality_profiles.including') %>&nbsp;<a
-              href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{@profile.key()}|activation=true|languages=#{@profile.language()}|statuses=DEPRECATED" -%>"
-              ><%= @deprecated_active_rules -%></a>&nbsp;<%= message('quality_profiles.deprecated') %>
-          </div>
-        <% end %>
-      </div>
-    </div>
-
-    <% if @stats
-         severity_stats = @stats.get('severity')
-         severity_map = Hash[ *severity_stats.collect { |v| [ v.getKey(), v ] }.flatten ]
-
-         max = severity_stats.map { |val| val.getValue() }.max
-      %>
-      <div class="widget-span widget-span-3">
-        <div class="widget-measure-container">
-          <table class="data" style="width: 240px">
-            <tbody>
-            <% Severity::KEYS.each do |key|
-              stat = severity_map[key]
-              severity = key.downcase
-              value = 0
-              value = stat.getValue() if stat
-            -%>
-              <tr>
-                <td>
-                  <i class="icon-severity-<%= severity %>"></i> <%= message(severity) -%>
-                </td>
-                <td class="thin text-right">
-                  <a href="<%= "#{ApplicationController.root_context}/coding_rules#qprofile=#{@profile.key()}|activation=true|languages=#{@profile.language()}|active_severities=#{severity.upcase}" -%>"
-                    class="widget-link">
-                    <span><%= value -%></span>
-                  </a>
-                </td>
-                <td class="nowrap ">
-                  <% if max > 0 %>
-                    <%= barchart(:width => 70, :percent => (100 * value / max).to_i) %>
-                  <% end %>
-                </td>
-              </tr>
-            <% end -%>
-            </tbody>
-          </table>
-        </div>
-      </div>
-    <% end -%>
-  </div>
-</div>
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/quality_profiles/index.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/quality_profiles/index.html.erb
deleted file mode 100644 (file)
index 3084e76..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<% content_for :script do %>
-  <script>require(['quality-profiles/app']);</script>
-<% end %>
-
-<div class="search-navigator" id="quality-profiles"></div>
index 3a1d118178e3b1e63658ce83b6b80d2d42903b88..d5088ab82a56456991d59861afd51747d30189ac 100644 (file)
@@ -29,7 +29,7 @@ lib.configureCasper();
 
 casper.test.begin(testName('Should Show List'), 9, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
@@ -71,7 +71,7 @@ casper.test.begin(testName('Should Show List'), 9, function (test) {
 
 casper.test.begin(testName('Should Show Details'), 9, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
@@ -119,7 +119,7 @@ casper.test.begin(testName('Should Show Details'), 9, function (test) {
 
 casper.test.begin(testName('Should Show Inheritance Details'), 10, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-inheritance.json');
@@ -169,7 +169,7 @@ casper.test.begin(testName('Should Show Inheritance Details'), 10, function (tes
 
 casper.test.begin(testName('Should Show Selected Projects'), 2, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
@@ -214,7 +214,7 @@ casper.test.begin(testName('Should Show Selected Projects'), 2, function (test)
 
 casper.test.begin(testName('Copy Profile'), 5, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
@@ -272,7 +272,7 @@ casper.test.begin(testName('Copy Profile'), 5, function (test) {
 
 casper.test.begin(testName('Rename Profile'), 2, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
@@ -330,7 +330,7 @@ casper.test.begin(testName('Rename Profile'), 2, function (test) {
 
 casper.test.begin(testName('Make Profile Default'), 4, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
@@ -382,7 +382,7 @@ casper.test.begin(testName('Make Profile Default'), 4, function (test) {
 
 casper.test.begin(testName('Delete Profile'), 2, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-with-copy.json');
@@ -437,7 +437,7 @@ casper.test.begin(testName('Delete Profile'), 2, function (test) {
 
 casper.test.begin(testName('Create Profile'), 2, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
@@ -492,7 +492,7 @@ casper.test.begin(testName('Create Profile'), 2, function (test) {
 
 casper.test.begin(testName('Restore Built-in Profiles'), 2, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-modified.json');
@@ -546,7 +546,7 @@ casper.test.begin(testName('Restore Built-in Profiles'), 2, function (test) {
 
 casper.test.begin(testName('Change Parent'), 1, function (test) {
   casper
-      .start(lib.buildUrl('quality_profiles'), function () {
+      .start(lib.buildUrl('profiles'), function () {
         lib.setDefaultViewport();
 
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-change-parent.json');
diff --git a/server/sonar-web/src/test/views/profiles.jade b/server/sonar-web/src/test/views/profiles.jade
new file mode 100644 (file)
index 0000000..e17181b
--- /dev/null
@@ -0,0 +1,5 @@
+extends layouts/main
+
+block body
+  #content
+    .search-navigator#quality-profiles
diff --git a/server/sonar-web/src/test/views/quality_profiles.jade b/server/sonar-web/src/test/views/quality_profiles.jade
deleted file mode 100644 (file)
index e17181b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-extends layouts/main
-
-block body
-  #content
-    .search-navigator#quality-profiles