On 04/19/2011 08:15 PM, Matt Wagner wrote:
---
.../image_factory/deployables_controller.rb | 41 +++++++++++++++++++-
.../image_factory/deployables/_assemblies.haml | 28 +++++++++++++
src/app/views/image_factory/deployables/_form.haml | 3 +
.../deployables/_pick_assemblies.haml | 16 ++++++++
.../image_factory/deployables/pick_assemblies.haml | 5 ++
src/app/views/layouts/_details_pane.haml | 2 +-
src/config/locales/en.yml | 1 +
src/config/routes.rb | 2 +-
src/features/deployable.feature | 25 ++++++++++++
src/features/step_definitions/assembly_steps.rb | 14 +++++++
10 files changed, 133 insertions(+), 4 deletions(-)
create mode 100644 src/app/views/image_factory/deployables/_assemblies.haml
create mode 100644 src/app/views/image_factory/deployables/_pick_assemblies.haml
create mode 100644 src/app/views/image_factory/deployables/pick_assemblies.haml
create mode 100644 src/features/step_definitions/assembly_steps.rb
diff --git a/src/app/controllers/image_factory/deployables_controller.rb
b/src/app/controllers/image_factory/deployables_controller.rb
index 917d0d6..05e9596 100644
--- a/src/app/controllers/image_factory/deployables_controller.rb
+++ b/src/app/controllers/image_factory/deployables_controller.rb
@@ -1,6 +1,7 @@
class ImageFactory::DeployablesController< ApplicationController
before_filter :require_user
- before_filter :load_deployables, :only => [:index, :show]
+ before_filter :load_deployables, :only => [:index, :show, :pick_assemblies]
+ before_filter :load_deployable_with_assemblies, :only => [:remove_assemblies,
:add_assemblies, :pick_assemblies]
def index
end
@@ -8,7 +9,7 @@ class ImageFactory::DeployablesController< ApplicationController
def show
@deployable = Deployable.find(params[:id])
@url_params = params.clone
- @tab_captions = ['Properties']
+ @tab_captions = ['Properties', 'Assemblies']
@details_tab = params[:details_tab].blank? ? 'properties' :
params[:details_tab]
respond_to do |format|
format.js do
@@ -70,6 +71,38 @@ class ImageFactory::DeployablesController< ApplicationController
redirect_to image_factory_deployables_url
end
+ def pick_assemblies
+ @assemblies = Assembly.all - @deployable.assemblies
+ respond_to do |format|
+ format.js { render :partial => 'pick_assemblies' }
+ format.html { render 'pick_assemblies' }
+ end
+ end
+
+ def add_assemblies
+ if assemblies = params.delete(:assemblies_selected)
+ @deployable.assembly_ids += assemblies.collect{|a| a.to_i}
+ @deployable.save!
+ flash[:notice] = "Assemblies saved."
+ end
+ respond_to do |format|
+ format.js { render :partial => 'assemblies' }
+ format.html { redirect_to image_factory_deployable_url(@deployable, :details_tab
=> 'assemblies') and return }
+ end
+ end
+
+ def remove_assemblies
+ if params[:assemblies_selected].present?
+ @deployable.assembly_ids = @deployable.assembly_ids -
params[:assemblies_selected].collect{|a| a.to_i}
+ @deployable.save!
+ flash[:notice] = "Assemblies removed."
+ end
+ respond_to do |format|
+ format.js { render :partial => 'assemblies' }
+ format.html { redirect_to image_factory_deployable_url(@deployable, :details_tab
=> 'assemblies') and return }
+ end
+ end
+
protected
def load_deployables
@@ -82,4 +115,8 @@ class ImageFactory::DeployablesController< ApplicationController
)
@url_params = params.clone
end
+
+ def load_deployable_with_assemblies
+ @deployable = Deployable.find(params[:id], :include => :assemblies)
+ end
end
diff --git a/src/app/views/image_factory/deployables/_assemblies.haml
b/src/app/views/image_factory/deployables/_assemblies.haml
new file mode 100644
index 0000000..47f9f66
--- /dev/null
+++ b/src/app/views/image_factory/deployables/_assemblies.haml
@@ -0,0 +1,28 @@
+.grid_13
+- form_tag do
+ = restful_submit_tag "Remove Selected", 'destroy',
remove_assemblies_image_factory_deployable_path(@deployable), 'DELETE', :id =>
'delete_button'
+ = link_to "Add Assembly...",
pick_assemblies_image_factory_deployable_path(@deployable), :class =>
'button', :id => 'add_assembly'
+
+ %table#assemblies_table
+ %thead
+ %tr
+ %th
+ %th= "Name"
+ %th= "Created"
+ -@deployable.assemblies(:include => :templates).each do |assembly|
+ %tr
+ %td
+ %input{:name => "assemblies_selected[]", :type =>
"checkbox", :value => assembly.id, :id =>
"assembly_checkbox_#{assembly.id}" }
+ %td= assembly.name
+ %td= assembly.created_at
+
+:javascript
+ $(document).ready(function () {
+ $('#add_assembly').click(function(e) {
+ e.preventDefault();
+ var url = $(this).attr('href');
+ $.get(url, function(data) {
+ $('#ui-tabs-2').html(data);
+ });
+ });
+ });
\ No newline at end of file
diff --git a/src/app/views/image_factory/deployables/_form.haml
b/src/app/views/image_factory/deployables/_form.haml
index cd08ebc..98c2232 100644
--- a/src/app/views/image_factory/deployables/_form.haml
+++ b/src/app/views/image_factory/deployables/_form.haml
@@ -2,6 +2,9 @@
%fieldset.clear
= form.label :name, t(:name), :class => "grid_3 alpha"
= form.text_field :name, :class => "grid_5"
+%fieldset.clear
+ = form.label :summary, t(:summary), :class => "grid_3 alpha"
+ = form.text_area :summary, :class => "grid_5", :rows => 3
%fieldset.clearfix
= form.submit "Save", :class => "submit formbutton"
= link_to t(:cancel), image_factory_deployables_path, :class => 'button
formbutton'
diff --git a/src/app/views/image_factory/deployables/_pick_assemblies.haml
b/src/app/views/image_factory/deployables/_pick_assemblies.haml
new file mode 100644
index 0000000..cfaf30b
--- /dev/null
+++ b/src/app/views/image_factory/deployables/_pick_assemblies.haml
@@ -0,0 +1,16 @@
+.grid_13
+ - form_tag(image_factory_deployable_path(@deployable)) do
+ %table#assemblies_list
+ %thead
+ %tr
+ %th
+ %th= "Name"
+ -(a)assemblies.each do |assembly|
+ %tr
+ %td
+ %input{:name => "assemblies_selected[]", :type =>
"checkbox", :value => assembly.id, :id =>
"assembly_checkbox_#{assembly.id}" }
+ %td= assembly.name
+
+ -# AJAX post
+ = restful_submit_tag('Save', 'add_assemblies',
add_assemblies_image_factory_deployable_path(@deployable), 'PUT')
+ = link_to "Back", image_factory_deployable_path(@deployable, :details_tab
=> 'assemblies'), :class => 'button'
diff --git a/src/app/views/image_factory/deployables/pick_assemblies.haml
b/src/app/views/image_factory/deployables/pick_assemblies.haml
new file mode 100644
index 0000000..c223367
--- /dev/null
+++ b/src/app/views/image_factory/deployables/pick_assemblies.haml
@@ -0,0 +1,5 @@
+- content_for :list do
+ = render :partial => 'list'
+
+- content_for :details do
+ = render :partial => 'pick_assemblies'
diff --git a/src/app/views/layouts/_details_pane.haml
b/src/app/views/layouts/_details_pane.haml
index c38bff4..9e895e9 100644
--- a/src/app/views/layouts/_details_pane.haml
+++ b/src/app/views/layouts/_details_pane.haml
@@ -1,7 +1,7 @@
%ul.ui-tabs-nav.ui-helper-reset.ui-helper-clearfix.ui-widget-header.ui-corner-all
- @tab_captions.each do |tab|
%li.ui-state-default.ui-corner-top{ :class => "#{'ui-tabs-selected
ui-state-active' if @details_tab == slug(tab)}"}
- %a{ :href => url_for(@url_params.merge(:details_tab => slug(tab)))}
+ %a{ :href => url_for(@url_params.merge(:details_tab => slug(tab))), :id
=> "details_#{tab}"}
%span
= tab
#details-selected
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index 3f8b566..9cfe221 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -106,6 +106,7 @@ en:
other: "Deployables %{list} were not deleted. They have deployments
associated with them."
setting: Settings
name: Name
+ summary: Summary
admin:
settings:
index:
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 162260c..54cb7c1 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -44,7 +44,7 @@ ActionController::Routing::Routes.draw do |map|
map.namespace 'image_factory' do |r|
r.resources :assemblies
r.resources :image_imports
- r.resources :deployables, :collection => { :multi_destroy => :delete }
+ r.resources :deployables, :collection => { :multi_destroy => :delete },
:member => { :pick_assemblies => :get, :remove_assemblies => :delete,
:add_assemblies => :put }
r.resources :templates, :collection => {:collections => :get, :add_selected
=> :get, :metagroup_packages => :get, :remove_package => :get, :multi_destroy
=> :delete}
r.connect "/builds/update_status.:format", :controller => :builds,
:action => :update_status
r.resources :builds, :collection => { :delete => :delete, :upload =>
:get, :retry => :post }
diff --git a/src/features/deployable.feature b/src/features/deployable.feature
index 012a459..7e1da9a 100644
--- a/src/features/deployable.feature
+++ b/src/features/deployable.feature
@@ -47,3 +47,28 @@ Feature: Manage Deployables
And I press "Delete"
Then I should be on the image factory deployables page
And there should be no deployables
+
+ Scenario: Add an assembly to a deployable
+ Given there is a deployable named "Webserver"
+ Given there is an assembly named "Apache"
+ And I am on the image factory deployables page
+ When I follow "Webserver"
+ And I follow "details_Assemblies"
+ And I follow "Add Assembly..."
+ Then I should see "Apache"
+ When I check the "Apache" assembly
+ And I press "Save"
+ Then I should see "Assemblies saved."
+ And I should see "Apache"
+
+ Scenario: Remove an assembly from a deployable
+ Given there is a deployable named "Webserver"
+ Given there is an assembly named "Apache" belonging to
"Webserver"
+ And I am on the image factory deployables page
+ When I follow "Webserver"
+ And I follow "details_Assemblies"
+ Then I should see "Apache"
+ When I check the "Apache" assembly
+ And I press "Remove Selected"
+ Then I should see "Assemblies removed."
+ And I should not see "Apache"
diff --git a/src/features/step_definitions/assembly_steps.rb
b/src/features/step_definitions/assembly_steps.rb
new file mode 100644
index 0000000..df70370
--- /dev/null
+++ b/src/features/step_definitions/assembly_steps.rb
@@ -0,0 +1,14 @@
+Given /^there is an assembly named "([^"]*)"$/ do |name|
+ Assembly.create!(:name => name, :architecture => 'x86_64')
+end
+
+Given /^there is an assembly named "([^"]*)" belonging to
"([^"]*)"$/ do |assembly_name, deployable_name|
+ deployable = Deployable.find_by_name(deployable_name)
+ deployable.assemblies.create!(:name => assembly_name, :architecture =>
'x86_64')
+# Assembly.create!(:name => assembly, :architecture => 'x86_64',
:deployable => Deployable.find_by_name(deployable))
+end
+
+When /^I check the "([^"]*)" assembly$/ do |name|
+ assembly = Assembly.find_by_name(name)
+ check("assembly_checkbox_#{assembly.id}")
+end
\ No newline at end of file
Nice, ACK and pushed.