diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2012-03-16 11:46:48 +0100 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2012-03-16 11:50:43 +0100 |
commit | f6a1da456075b5307537c9f736eecb656c5d3a2d (patch) | |
tree | 66d1d3bd84833af3ba30572629637ba69537791f /sonar-server/src/main/webapp/WEB-INF | |
parent | ab19fa283c7c86034ebde4823b3b8675797d9fbb (diff) | |
download | sonarqube-f6a1da456075b5307537c9f736eecb656c5d3a2d.tar.gz sonarqube-f6a1da456075b5307537c9f736eecb656c5d3a2d.zip |
SONAR-1378 validate property types + update type of core properties
Diffstat (limited to 'sonar-server/src/main/webapp/WEB-INF')
10 files changed, 203 insertions, 162 deletions
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb index c486dfd7d27..88ebe73790d 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/project_controller.rb @@ -126,13 +126,13 @@ class ProjectController < ApplicationController end @category=params[:category] ||= 'general' - @properties_per_category={} + @definitions_per_category={} definitions = java_facade.getPropertyDefinitions() - properties = definitions.getProperties().select { |property| (@project.module? && property.module()) || (@project.project? && property.project()) } + properties = definitions.getAll().select { |property| (@project.module? && property.isOnModule()) || (@project.project? && property.isOnProject()) } properties.each do |property| - category = definitions.getCategory(property.key()) - @properties_per_category[category]||=[] - @properties_per_category[category]<<property + category = definitions.getCategory(property.getKey()) + @definitions_per_category[category]||=[] + @definitions_per_category[category]<<property end end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb index 653c42d81ab..18c7e8f0797 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/settings_controller.rb @@ -20,7 +20,7 @@ class SettingsController < ApplicationController SECTION=Navigation::SECTION_CONFIGURATION - + SPECIAL_CATEGORIES=['email', 'encryption', 'server_id'] verify :method => :post, :only => ['update'], :redirect_to => {:action => :index} @@ -32,39 +32,39 @@ class SettingsController < ApplicationController end def update - project=nil + @project=nil if params[:resource_id] - project=Project.by_key(params[:resource_id]) - access_denied unless (project && is_admin?(project)) + @project=Project.by_key(params[:resource_id]) + access_denied unless (@project && is_admin?(@project)) else access_denied unless is_admin? end - load_properties(project) + load_properties(@project) + + @persisted_properties_per_key={} + if @category && @definitions_per_category[@category] + @definitions_per_category[@category].each do |property| + value=params[property.getKey()] - if @category && @properties_per_category[@category] - @properties_per_category[@category].each do |property| - value=params[property.key()] - persisted_property = Property.find(:first, :conditions => {:prop_key=> property.key(), :resource_id => (project ? project.id : nil), :user_id => nil}) + persisted_property = Property.find(:first, :conditions => {:prop_key=> property.key(), :resource_id => (@project ? @project.id : nil), :user_id => nil}) if persisted_property if value.empty? - Property.delete_all('prop_key' => property.key(), 'resource_id' => (project ? project.id : nil), 'user_id' => nil) + Property.delete_all('prop_key' => property.key(), 'resource_id' => (@project ? @project.id : nil), 'user_id' => nil) elsif persisted_property.text_value != value.to_s persisted_property.text_value = value.to_s - persisted_property.save! + persisted_property.save + @persisted_properties_per_key[persisted_property.key]=persisted_property end elsif !value.blank? - Property.create(:prop_key => property.key(), :text_value => value.to_s, :resource_id => (project ? project.id : nil)) + persisted_property=Property.create(:prop_key => property.key(), :text_value => value.to_s, :resource_id => (@project ? @project.id : nil)) + @persisted_properties_per_key[persisted_property.key]=persisted_property end end java_facade.reloadConfiguration() - flash[:notice] = 'Parameters updated' - end - if project - redirect_to :controller => 'project', :action => 'settings', :id => project.id, :category => @category - else - redirect_to :controller => 'settings', :action => 'index', :category => @category + params[:layout]='false' + render :partial => 'settings/properties' end end @@ -72,18 +72,18 @@ class SettingsController < ApplicationController def load_properties(project) @category=params[:category] - @properties_per_category={} + @definitions_per_category={} definitions = java_facade.getPropertyDefinitions() - definitions.getProperties().select {|property| - (project.nil? && property.global) || (project && project.module? && property.module()) || (project && project.project? && property.project()) - }.each do |property| - category = definitions.getCategory(property.key()) - @properties_per_category[category]||=[] - @properties_per_category[category]<<property + definitions.getAll().select { |property_definition| + (project.nil? && property_definition.isGlobal()) || (project && project.module? && property_definition.isOnModule()) || (project && project.project? && property_definition.isOnProject()) + }.each do |property_definition| + category = definitions.getCategory(property_definition.getKey()) + @definitions_per_category[category]||=[] + @definitions_per_category[category]<<property_definition end SPECIAL_CATEGORIES.each do |category| - @properties_per_category[category]=[] + @definitions_per_category[category]=[] end end end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb index ccef420c136..b388a5bec6b 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/models/property.rb @@ -18,6 +18,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 # class Property < ActiveRecord::Base + validates_presence_of :prop_key def key prop_key @@ -87,8 +88,22 @@ class Property < ActiveRecord::Base xml end + def java_definition + @java_definition ||= + begin + Java::OrgSonarServerUi::JRubyFacade.getInstance().getPropertyDefinitions().get(key) + end + end + private + def validate + if java_definition + validation_result=java_definition.validate(text_value) + errors.add_to_base(validation_result.getErrorKey()) unless validation_result.isValid() + end + end + def self.reload_java_configuration Java::OrgSonarServerUi::JRubyFacade.getInstance().reloadConfiguration() end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings.html.erb index cb5e508f23b..8e2f68f1870 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/project/settings.html.erb @@ -3,7 +3,7 @@ <h1 class="marginbottom10">Settings</h1> <div class="yui-g widget" id="widget_plugins"> - <%= render :partial => 'settings/plugins', :locals => {:project=>@project} %> + <%= render :partial => 'settings/settings', :locals => {:project=>@project} %> </div> </div>
\ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb deleted file mode 100644 index 87a5a99b803..00000000000 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_plugins.html.erb +++ /dev/null @@ -1,128 +0,0 @@ -<style type="text/css"> - #plugins .plugin { - padding: 5px; - border: 1px solid #ddd; - background-color: #fff; - } - - #plugins .plugin h2 { - margin-left: 10px; - font-size: 122%; - color: #333; - } - - #plugins .plugin h3 { - margin-left: 5px; - } - - #plugins .plugin p { - padding: 5px 5px; - } - - #plugins .plugin img { - padding: 5px 0 0 5px; - } -</style> -<script type="text/javascript"> - function enlargeTextInput(propertyKey) { - var eltId = 'input_' + propertyKey; - var textValue = $F(eltId); - var textArea = '<textarea class="width100" id="' + propertyKey + '" name="' + propertyKey + '" rows="10" id="input_' + propertyKey + '">' + textValue + '</textarea>'; - $(eltId).parentNode.replace(textArea); - } -</script> -<div id="plugins"> - <table width="100%"> - <tr> - <td width="1%" nowrap class="column first"> - <table class="data selector"> - <thead> - <tr> - <th> - <span>Category</span> - </th> - </tr> - </thead> - <tbody> - <% - @properties_per_category.keys.sort_by { |category| message("property.category.#{category}", :default => category).upcase }.each do |category| - if !@properties_per_category[category].empty? || SettingsController::SPECIAL_CATEGORIES.include?(category) - %> - <tr class="select <%= cycle('even', 'odd', :name => 'category') -%> <%= 'selected' if @category==category -%>" id="select_<%= category -%>"> - <td><%= link_to message("property.category.#{category}", :default => category), :overwrite_params => {:category => category} -%></td> - </tr> - <% end - end - %> - </tbody> - </table> - <br/> - </td> - - <td class="column"> - <% if @category && @properties_per_category[@category] - category_name = message("property.category.#{@category}", :default => @category) - if SettingsController::SPECIAL_CATEGORIES.include?(@category) - %> - <%= render :partial => 'special', :locals => {:url => url_for(:controller => "#{@category}_configuration")} -%> - <% - elsif !@properties_per_category[@category].empty? - %> - <% form_tag :controller => :settings, :action => :update do %> - <%= hidden_field_tag('category', @category) -%> - <% if @project %> - <input type="hidden" name="resource_id" value="<%= @project.id -%>"/> - <% end %> - <table class="data marginbottom10"> - <thead> - <tr> - <th> - <span><%= h(category_name) -%></span> - </th> - </tr> - </thead> - <tbody> - <% - if @properties_per_category[@category] - @properties_per_category[@category].each do |property| - value = Property.value(property.key(), (@project ? @project.id : nil), '') - - # for backward-compatibility with properties that do not define the type TEXT - property_type = value.include?("\n") ? 'TEXT' : property.type - %> - <tr class="<%= cycle('even', 'odd', :name => 'properties') -%>"> - <td style="padding: 10px"> - <h3> - <%= message("property.#{property.key()}.name", :default => property.name()) -%> - <br/><span class="note"><%= property.key() -%></span> - </h3> - <% - desc=message("property.#{property.key()}.description", :default => property.description()) - if desc.present? %> - <p class="marginbottom10"><%= desc -%></p> - <% end %> - <div><%= render :partial => "settings/type_#{property_type}", :locals => {:property => property, :value => value} -%></div> - <p> - <% - default_prop_value = (@project ? Property.value(property.key(), nil, property.defaultValue()) : property.defaultValue()) - unless default_prop_value.blank? %> - <span class="note">Default : <%= h default_prop_value -%></span> - <% end %> - </p> - </td> - </tr> - <% end - end - %> - </tbody> - </table> - <% save_message=message('settings.save_category', :params => [category_name]) %> - <%= submit_tag(save_message, :disable_with => save_message, :id => 'save') -%> - <% end %> - <% end - end - %> - </td> - </tr> - </table> -</div> diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_properties.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_properties.html.erb new file mode 100644 index 00000000000..fc2fbd2ae09 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_properties.html.erb @@ -0,0 +1,85 @@ +<% if @category && @definitions_per_category[@category] + category_name = message("property.category.#{@category}", :default => @category) + if SettingsController::SPECIAL_CATEGORIES.include?(@category) +%> + <%= render :partial => 'special', :locals => {:url => url_for(:controller => "#{@category}_configuration")} -%> + <% + elsif !@definitions_per_category[@category].empty? + %> + <% form_remote_tag :url => {:controller => 'settings', :action => 'update', :category => @category, :resource_id => @project ? @project.id : nil}, + :method => :post, + :before => "$('submit_settings').hide();$('loading_settings').show()", + :update => 'properties' do -%> + + <table class="data marginbottom10"> + <thead> + <tr> + <th> + <span><%= h(category_name) -%></span> + </th> + </tr> + </thead> + <tbody> + <% + if @definitions_per_category[@category] + @definitions_per_category[@category].each do |property| + value = nil + + # set when form has been submitted but some errors have been raised + if @persisted_properties_per_key + p = @persisted_properties_per_key[property.key] + if p + value = p.text_value + end + end + + + # if fresh form or no error, get the current value + value = Property.value(property.getKey(), (@project ? @project.id : nil), '') unless value + + # for backward-compatibility with properties that do not define the type TEXT + property_type = value.include?("\n") ? 'TEXT' : property.getType() + %> + <tr class="<%= cycle('even', 'odd', :name => 'properties') -%>"> + <td style="padding: 10px" id="foo_<%= property.getKey() -%>"> + <h3> + <%= message("property.#{property.key()}.name", :default => property.name()) -%> + <br/><span class="note"><%= property.getKey() -%></span> + </h3> + <% + desc=message("property.#{property.key()}.description", :default => property.description()) + if desc.present? %> + <p class="marginbottom10"><%= desc -%></p> + <% end %> + <div><%= render :partial => "settings/type_#{property_type}", :locals => {:property => property, :value => value} -%></div> + <% + if p + p.errors.each_full do |error| + %> + <div class="error"><%= message("property.error.#{error}") -%></div> + <% + end + end + %> + <p> + <% + default_prop_value = (@project ? Property.value(property.key(), nil, property.defaultValue()) : property.defaultValue()) + unless default_prop_value.blank? %> + <span class="note">Default : <%= h default_prop_value -%></span> + <% end %> + </p> + </td> + </tr> + <% end + end + %> + </tbody> + </table> + <div> + <%= submit_tag(message('settings.save_category', :params => [category_name]), :id => 'submit_settings') -%> + <img src="<%= ApplicationController.root_context -%>/images/loading.gif" id="loading_settings" style="display:none"> + </div> + <% end %> + <% end + end + %> diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_settings.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_settings.html.erb new file mode 100644 index 00000000000..cbd85572a12 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_settings.html.erb @@ -0,0 +1,69 @@ +<style type="text/css"> + #plugins .plugin { + padding: 5px; + border: 1px solid #ddd; + background-color: #fff; + } + + #plugins .plugin h2 { + margin-left: 10px; + font-size: 122%; + color: #333; + } + + #plugins .plugin h3 { + margin-left: 5px; + } + + #plugins .plugin p { + padding: 5px 5px; + } + + #plugins .plugin img { + padding: 5px 0 0 5px; + } +</style> +<script type="text/javascript"> + function enlargeTextInput(propertyKey) { + var eltId = 'input_' + propertyKey; + var textValue = $F(eltId); + var textArea = '<textarea class="width100" id="' + propertyKey + '" name="' + propertyKey + '" rows="10" id="input_' + propertyKey + '">' + textValue + '</textarea>'; + $(eltId).parentNode.replace(textArea); + } +</script> +<div id="plugins"> + <table width="100%"> + <tr> + <td width="1%" nowrap class="column first"> + <table class="data selector"> + <thead> + <tr> + <th> + <span>Category</span> + </th> + </tr> + </thead> + <tbody> + <% + @definitions_per_category.keys.sort_by { |category| message("property.category.#{category}", :default => category).upcase }.each do |category| + if !@definitions_per_category[category].empty? || SettingsController::SPECIAL_CATEGORIES.include?(category) + %> + <tr class="select <%= cycle('even', 'odd', :name => 'category') -%> <%= 'selected' if @category==category -%>" id="select_<%= category -%>"> + <td><%= link_to message("property.category.#{category}", :default => category), :overwrite_params => {:category => category} -%></td> + </tr> + <% end + end + %> + </tbody> + </table> + <br/> + </td> + + <td class="column"> + <div id="properties"> + <%= render :partial => 'settings/properties' -%> + </div> + </td> + </tr> + </table> +</div> diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_sidebar.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_sidebar.html.erb new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_sidebar.html.erb diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_type_SINGLE_SELECT_LIST.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_type_SINGLE_SELECT_LIST.html.erb index a6f905a3038..a317e48ef38 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_type_SINGLE_SELECT_LIST.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/_type_SINGLE_SELECT_LIST.html.erb @@ -1,6 +1,6 @@ <select name="<%= h property.key -%>" id="input_<%= h property.key-%>"> <option value=""><%= message('default') -%></option> <% property.options.each do |option| %> - <option value="<%= h option -%>"><%= h option -%></option> + <option value="<%= h option -%>" <%= 'selected' if value && value==option -%>><%= h option -%></option> <% end %> </select>
\ No newline at end of file diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/index.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/index.html.erb index d0fc6625477..81fa7362a09 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/settings/index.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/settings/index.html.erb @@ -1 +1 @@ -<%= render :partial => 'plugins', :locals => {:project=>nil} %>
\ No newline at end of file +<%= render :partial => 'settings', :locals => {:project=>nil} %>
\ No newline at end of file |