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 : '&nbsp;'
+          .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

Reply via email to