ACK
----- Original Message ----- From: [email protected] To: [email protected] Sent: Friday, October 1, 2010 3:57:13 PM GMT +01:00 Amsterdam / Berlin / Bern / Rome / Stockholm / Vienna Subject: [deltacloud-devel] [PATCH aggregator] Changed package selection behavior From: Jan Provaznik <[email protected]> if JS is enabled: - packages/groups selection list is displayed below selected packages when user click "add software" elsif JS is off: - packages/groups are selected on separate page by checkboxes - packages which are already selected are checked and disabled in selection list - when whole group is checked, only non-optional packages are selected --- src/app/controllers/templates_controller.rb | 50 +++++++++------- src/app/util/image_descriptor_xml.rb | 4 +- src/app/util/repository_manager.rb | 28 +++++++++ .../util/repository_manager/comps_repository.rb | 3 +- src/app/util/repository_manager/pulp_repository.rb | 7 +- src/app/views/templates/_content_selection.haml | 63 ++++++++++++-------- src/app/views/templates/_managed_content.haml | 40 ++++++++---- src/app/views/templates/add_software_form.haml | 1 + src/app/views/templates/new.haml | 38 +++++++++++- src/features/template.feature | 15 ++--- 10 files changed, 170 insertions(+), 79 deletions(-) create mode 100644 src/app/views/templates/add_software_form.haml diff --git a/src/app/controllers/templates_controller.rb b/src/app/controllers/templates_controller.rb index 9361eff..28577c6 100644 --- a/src/app/controllers/templates_controller.rb +++ b/src/app/controllers/templates_controller.rb @@ -57,10 +57,20 @@ class TemplatesController < ApplicationController # synchronize it at first to xml @tpl.update_xml_attributes!(params[:tpl]) - # if add/remove pkg/group, we only update xml and render 'new' template + # if remove pkg, we only update xml and render 'new' template # again - if update_selection - render :action => 'new' + params.keys.each do |param| + if param =~ /^remove_package_(.*)$/ + update_group_or_package(:remove_package, $1, nil) + render :action => 'new' + return + end + end + + if params[:add_software_form] + @repository_manager = RepositoryManager.new + @groups = @repository_manager.all_groups_with_tagged_selected_packages(@tpl.xml.packages, params[:repository]) + render :action => 'add_software_form' return end @@ -75,6 +85,22 @@ class TemplatesController < ApplicationController end end + def add_software + @tpl = params[:template_id].to_s.empty? ? Template.new : Template.find(params[:template_id]) + @repository_manager = RepositoryManager.new + @groups = @repository_manager.all_groups(params[:repository]) + if params[:add_selected] + params[:groups].to_a.each { |group| @tpl.xml.add_group(group) } + params[:packages].to_a.each { |pkg| @tpl.xml.add_package(pkg, nil) } + @tpl.save_xml! + end + if params[:ajax] + render :partial => 'managed_content' + else + render :action => 'new' + end + end + def build_form raise "select template to build" unless params[:image] and params[:image][:template_id] @image = Image.new(params[:image]) @@ -133,24 +159,6 @@ class TemplatesController < ApplicationController private - def update_selection - # TODO: don't know better way how to select package and also save other form data than - # passing pkg/group as part of submit button name - params.keys.each do |param| - if param =~ /^select_package_(.*)$/ - update_group_or_package(:add_package, $1, nil) - return true - elsif param =~ /^remove_package_(.*)$/ - update_group_or_package(:remove_package, $1, nil) - return true - elsif param =~ /^select_group_(.*)$/ - update_group_or_package(:add_group, $1) - return true - end - end - return false - end - def update_group_or_package(method, *args) @repository_manager = RepositoryManager.new @groups = @repository_manager.all_groups(params[:repository]) diff --git a/src/app/util/image_descriptor_xml.rb b/src/app/util/image_descriptor_xml.rb index 28effb5..f437574 100644 --- a/src/app/util/image_descriptor_xml.rb +++ b/src/app/util/image_descriptor_xml.rb @@ -199,8 +199,8 @@ class ImageDescriptorXML groups_node = get_or_create_node('groups') add_group_node(groups_node, gname) end - group[:packages].each do |p, type| - next if type == 'optional' + group[:packages].each do |p, info| + next if info[:type] == 'optional' add_package(p, group[:name]) end end diff --git a/src/app/util/repository_manager.rb b/src/app/util/repository_manager.rb index 11b6c5e..d34ccf5 100644 --- a/src/app/util/repository_manager.rb +++ b/src/app/util/repository_manager.rb @@ -58,6 +58,34 @@ class RepositoryManager return @all_packages end + def all_groups_with_tagged_selected_packages(pkgs, repository = nil) + groups = all_groups(repository) + groups.each_value do |group| + pkgs.each do |pkg| + next unless p = group[:packages][pkg[:name]] + p[:selected] = true + end + # if all non-optional packages are selected, mark all + # group as selected + group[:selected] = true + group[:packages].each_value do |pkg| + if pkg[:type] != 'optional' and !pkg[:selected] + group[:selected] = false + break + end + end + end + return groups + end + + def repositories_hash + res = {} + @repositories.each do |r| + res[r.id] = r + end + res + end + private def load_config diff --git a/src/app/util/repository_manager/comps_repository.rb b/src/app/util/repository_manager/comps_repository.rb index d7e192a..4454e5a 100644 --- a/src/app/util/repository_manager/comps_repository.rb +++ b/src/app/util/repository_manager/comps_repository.rb @@ -32,6 +32,7 @@ class CompsRepository < AbstractRepository groups[name] = { :name => name, :description => (t = g.at_xpath('description')) ? t.text : '', + :repository_id => @id, :packages => pkgs, } end @@ -74,7 +75,7 @@ class CompsRepository < AbstractRepository def get_group_packages(group_node) pkgs = {} group_node.xpath('packagelist/packagereq').each do |p| - pkgs[p.text] = p.attr('type') + (pkgs[p.text] ||= {})[:type] = p.attr('type') end return pkgs end diff --git a/src/app/util/repository_manager/pulp_repository.rb b/src/app/util/repository_manager/pulp_repository.rb index 5641f0c..8dbd9ec 100644 --- a/src/app/util/repository_manager/pulp_repository.rb +++ b/src/app/util/repository_manager/pulp_repository.rb @@ -49,14 +49,15 @@ class PulpRepository < AbstractRepository groups = {} WrappedRestClient.get(@groups_url, HTTP_OPTS).each do |id, info| pkgs = {} - info['default_package_names'].each {|p| pkgs[p] = 'default'} - info['optional_package_names'].each {|p| pkgs[p] = 'optional'} - info['mandatory_package_names'].each {|p| pkgs[p] = 'mandatory'} + info['default_package_names'].each {|p| pkgs[p] = {:type => 'default'}} + info['optional_package_names'].each {|p| pkgs[p] = {:type => 'optional'}} + info['mandatory_package_names'].each {|p| pkgs[p] = {:type => 'mandatory'}} next if pkgs.empty? name = info['name'] groups[name] = { :name => name, :description => info['description'].to_s, + :repository_id => @id, :packages => pkgs, } end diff --git a/src/app/views/templates/_content_selection.haml b/src/app/views/templates/_content_selection.haml index 2ca99fe..f080f4a 100644 --- a/src/app/views/templates/_content_selection.haml +++ b/src/app/views/templates/_content_selection.haml @@ -1,31 +1,42 @@ %h3 Managed Content Selection %h5 Search for Content -= text_field_tag 'search', 'Search Text', :disabled => true -%a Advanced Search +- form_tag :action => "add_software" do + = text_field_tag 'search', 'Search Text', :disabled => true + = hidden_field_tag :template_id, @tpl.id + %a Advanced Search -%p - Repositories to Search: - %a (Check all) -%fieldset - - @repository_manager.repositories.each do |repo| - = check_box_tag 'repositories[]', repo.id, true - = label_tag 'repositories[]', repo.name -%fieldset - .grid_3.alpha - = radio_button_tag :show_mode, 'group', true - = label_tag :show_mode, 'Show by Group' - .grid_2.omega - = radio_button_tag :show_mode, 'type', false, :disabled => true - = label_tag :show_mode, 'Show by Type' + %p + Repositories to Search: + %a (Check all) + %fieldset + - @repository_manager.repositories.each do |repo| + = check_box_tag 'repositories[]', repo.id, true + = label_tag 'repositories[]', repo.name + %fieldset + .grid_3.alpha + = radio_button_tag :show_mode, 'group', true + = label_tag :show_mode, 'Show by Group' + .grid_2.omega + = radio_button_tag :show_mode, 'type', false, :disabled => true + = label_tag :show_mode, 'Show by Type' -%ul.sidebarcontainer - - @groups.keys.sort.each do |group| - %li - %h5.grid_4.alpha= group - = submit_tag "Add", :name => "select_group_#{group}", :id => "select_group_#{group}", :class => "grid_1 omega" - %ul - - @groups[group][:packages].each do |pkg, type| - %li - %span.grid_4.alpha= pkg - = submit_tag "Add", :name => "select_package_#{pkg}", :id => "select_package_#{pkg}", :class => "grid_1 omega" + = submit_tag "Add Selected", :name => "add_selected", :class => "dialogbutton" + = submit_tag "Cancel", :name => "cancel", :class => "dialogbutton" + %ul.sidebarcontainer + - @groups.keys.sort.each do |group| + - group_sel = @groups[group][:selected] + - group_id = group.gsub(/\s/, '_') + %li + = check_box_tag 'groups[]', group, group_sel, :disabled => group_sel, :id => "group_#{group_id}" + = label_tag "group_#{group_id}", group + %ul + - @groups[group][:packages].each do |pkg, info| + - pkg_sel = info[:selected] ? true : false + - pkg_id = pkg.gsub(/\s/, '_') + %li + = check_box_tag 'packages[]', pkg, pkg_sel, :disabled => pkg_sel, :id => "package_#{pkg_id}" + = label_tag "package_#{pkg_id}", pkg + + = submit_tag "Add Selected", :name => "add_selected", :class => "dialogbutton" + = submit_tag "Cancel", :name => "cancel", :class => "dialogbutton" diff --git a/src/app/views/templates/_managed_content.haml b/src/app/views/templates/_managed_content.haml index 2ce8131..1597ee0 100644 --- a/src/app/views/templates/_managed_content.haml +++ b/src/app/views/templates/_managed_content.haml @@ -1,14 +1,26 @@ -%h3.gap Managed Content to Bundle -%hr -%label.header.alpha.prefix_2.grid_2 Name: -%label.header.omega.grid_2.suffix_5 Repository: -%label.grid_2.alpha.clear Managed: -.grid_9.omega - - @tpl.xml.packages.each do |pkg| - %fieldset - = text_field_tag 'packages[]', pkg[:name], :disabled => true, :id => "selected_package_#{pkg[:name]}", :class => "alpha grid_2" - .grid_2 FIXME Repository - .grid_5.omega - %button{:type => 'button', :disabled => 'disabled'} Config - %button{:type => 'button', :disabled => 'disabled'} Metadata - = submit_tag "Remove", :name => "remove_package_#{pkg[:name]}", :id => "remove_package_#{pkg[:name]}" +#selected_packages + / we place template id into this partial, because + / if we want to add software with ajax, it's possible + / that template is not saved in db yet -> in this case + / template is saved when software is added and we have + / to pass template id back to new form + = hidden_field :tpl, :id + %h3.gap Managed Content to Bundle + %hr + %label.header.alpha.prefix_2.grid_2 Name: + %label.header.omega.grid_2.suffix_5 Repository: + %label.grid_2.alpha.clear Managed: + .grid_9.omega + - if @tpl.xml.packages.empty? + No selected packages + - else + - repos = @repository_manager.repositories_hash + - @tpl.xml.packages.each do |pkg| + - pkg_group = @groups.keys.find {|g| @groups[g][:packages][pkg[:name]]} + %fieldset + = text_field_tag 'packages[]', pkg[:name], :disabled => true, :id => "selected_package_#{pkg[:name]}", :class => "alpha grid_2" + .grid_2= (pkg_group and repo = rep...@groups[pkg_group][:repository_id]]) ? repo.name.to_s : ' ' + .grid_5.omega + %button{:type => 'button', :disabled => 'disabled'} Config + %button{:type => 'button', :disabled => 'disabled'} Metadata + = submit_tag "Remove", :name => "remove_package_#{pkg[:name]}", :id => "remove_package_#{pkg[:name]}" diff --git a/src/app/views/templates/add_software_form.haml b/src/app/views/templates/add_software_form.haml new file mode 100644 index 0000000..d32729a --- /dev/null +++ b/src/app/views/templates/add_software_form.haml @@ -0,0 +1 @@ += render :partial => 'content_selection' diff --git a/src/app/views/templates/new.haml b/src/app/views/templates/new.haml index fa82ce4..8b38b1f 100644 --- a/src/app/views/templates/new.haml +++ b/src/app/views/templates/new.haml @@ -1,7 +1,38 @@ +:javascript + $(document).ready(function() { + $(':submit[name=add_software_form]').click(function() { + $(this).css('display', 'none'); + var div = $('#package_selection_list'); + div.css('display', 'block'); + div.addClass('loading'); + // delete this styling when regular css #package_selection_list is done + div.css({'width': '600px', 'height': '300px', 'overflow': 'auto'}); + var list_url = '#{url_for :action => 'create', :ajax => true, :add_software_form => true}'; + var list_data = {'tpl[id]': $("input[name='tpl[id]']").val() || ''}; + div.load(list_url, list_data, function() { + div.removeClass('loading'); + $(':submit[name=add_selected]').click(function() { + var url = '#{url_for :action => 'add_software', :ajax => true, :add_selected => true}'; + var data = { + 'packages[]': $("input:checked[name='packages[]']").map(function() {return $(this).val()}).get(), + 'groups[]': $("input:checked[name='groups[]']").map(function() {return $(this).val()}).get(), + 'template_id': $("input[name='tpl[id]']").val() || '' + }; + $('#selected_packages').load(url, data, function() {}); + return false; + }); + $(':submit[name=cancel]').click(function() { + div.css('display', 'none'); + return false; + }); + }); + return false; + }); + }); + %h2.grid_16 Template - form_for @tpl, :url => { :action => "create" } do = error_messages_for 'tpl' - = hidden_field :tpl, :id .grid_11 = render :partial => 'basics' @@ -29,6 +60,8 @@ ) = render :partial => 'managed_content' + = submit_tag "Add Software", :name => "add_software_form" + #package_selection_list{:style => 'display: none'} %h3.gap.clear Preboot Configuration %hr @@ -45,6 +78,3 @@ = submit_tag "Save", :name => "save", :class => "dialogbutton" = submit_tag "Cancel", :name => "cancel", :class => "dialogbutton" - - .grid_5 - = render :partial => 'content_selection' diff --git a/src/features/template.feature b/src/features/template.feature index e9b4ed9..29d963e 100644 --- a/src/features/template.feature +++ b/src/features/template.feature @@ -22,23 +22,22 @@ Feature: Manage Templates And I should see "Template saved" And I should see "mocktemplate" - Scenario: Add/Remove a package and a group to/from the template + Scenario: Add group and remove package to/from the template Given I am on the templates page When I press "Template" Then I should be on the new template page When I fill in the following: | tpl_name | mocktemplate | - And I press "select_package_jboss-as5" - Then I should be on the create template page + And I press "Add Software" + Then I should see "Managed Content Selection" + When I check "group_JBoss_Core_Packages" + And I press "Add Selected" + Then I should see "Managed Content to Bundle" And the "tpl[name]" field by name should contain "mocktemplate" And the page should contain "#selected_package_jboss-as5" selector When I press "remove_package_jboss-as5" - Then I should be on the create template page + Then I should see "Managed Content to Bundle" And the page should not contain "#selected_package_jboss-as5" selector - When I press "select_group_JBoss Core Packages" - Then I should be on the create template page - And the "tpl[name]" field by name should contain "mocktemplate" - And the page should contain "#selected_package_jboss-jgroups" selector When I press "Save" Then I should be on the templates page And I should see "Template saved" -- 1.7.2.3 _______________________________________________ deltacloud-devel mailing list [email protected] https://fedorahosted.org/mailman/listinfo/deltacloud-devel _______________________________________________ deltacloud-devel mailing list [email protected] https://fedorahosted.org/mailman/listinfo/deltacloud-devel
