--- .../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" + -@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