From: Jan Provaznik <[email protected]>

- packages/groups are selected on separate page by checkboxes
- when whole group is checked, only non-optional packages are selected
- packages which are already selected are checked and disabled in selection list
---
 src/app/controllers/templates_controller.rb        |   46 ++++++++-------
 src/app/util/image_descriptor_xml.rb               |    4 +-
 src/app/util/repository_manager.rb                 |   20 ++++++
 .../util/repository_manager/comps_repository.rb    |    2 +-
 src/app/util/repository_manager/pulp_repository.rb |    6 +-
 src/app/views/templates/_content_selection.haml    |   63 ++++++++++++--------
 src/app/views/templates/_managed_content.haml      |    1 +
 src/app/views/templates/add_software_form.haml     |    1 +
 src/app/views/templates/new.haml                   |    3 -
 9 files changed, 90 insertions(+), 56 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..37bf727 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]
+      @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,18 @@ class TemplatesController < ApplicationController
     end
   end
 
+  def add_software
+    @tpl = params[:template_id] ? Template.find(params[:template_id]) : 
Template.new(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
+    render :action => 'new'
+  end
+
   def build_form
     raise "select template to build" unless params[:image] and 
params[:image][:template_id]
     @image = Image.new(params[:image])
@@ -133,24 +155,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..7ecaf35 100644
--- a/src/app/util/repository_manager.rb
+++ b/src/app/util/repository_manager.rb
@@ -58,6 +58,26 @@ 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
+
   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..9afe68b 100644
--- a/src/app/util/repository_manager/comps_repository.rb
+++ b/src/app/util/repository_manager/comps_repository.rb
@@ -74,7 +74,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..be6e72e 100644
--- a/src/app/util/repository_manager/pulp_repository.rb
+++ b/src/app/util/repository_manager/pulp_repository.rb
@@ -49,9 +49,9 @@ 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] = {
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..a769dbf 100644
--- a/src/app/views/templates/_managed_content.haml
+++ b/src/app/views/templates/_managed_content.haml
@@ -12,3 +12,4 @@
         %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]}"
+  = submit_tag "Add Software", :name => "add_software"
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..173549e 100644
--- a/src/app/views/templates/new.haml
+++ b/src/app/views/templates/new.haml
@@ -45,6 +45,3 @@
 
     = submit_tag "Save", :name => "save", :class => "dialogbutton"
     = submit_tag "Cancel", :name => "cancel", :class => "dialogbutton"
-
-  .grid_5
-    = render :partial => 'content_selection'
-- 
1.7.2.3

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to