Overall, this looks good, couple minor suggestions inline

On Thu, 2010-06-10 at 11:42 +0200, [email protected] wrote:
> From: Jan Provaznik <[email protected]>
> 
> - "new" action is splited into 4 actions according UI forms (new, service, 
> software, summary)
Minor grammar fix ^ s/splited/split and s/according/corresponding
> - image descriptor id is passed by 'id'
> ---
>  src/app/controllers/image_descriptor_controller.rb |   77 ++++++++++++-------
>  src/app/views/image_descriptor/_nav.haml           |    8 +-
>  src/app/views/image_descriptor/_services.haml      |   32 --------
>  src/app/views/image_descriptor/_software.haml      |   72 ------------------
>  src/app/views/image_descriptor/_summary.haml       |   58 ---------------
>  src/app/views/image_descriptor/new.haml            |   23 +++++-
>  src/app/views/image_descriptor/services.haml       |   37 +++++++++
>  src/app/views/image_descriptor/software.haml       |   78 
> ++++++++++++++++++++
>  src/app/views/image_descriptor/summary.haml        |   64 ++++++++++++++++
>  9 files changed, 249 insertions(+), 200 deletions(-)
>  delete mode 100644 src/app/views/image_descriptor/_services.haml
>  delete mode 100644 src/app/views/image_descriptor/_software.haml
>  delete mode 100644 src/app/views/image_descriptor/_summary.haml
>  create mode 100644 src/app/views/image_descriptor/services.haml
>  create mode 100644 src/app/views/image_descriptor/software.haml
>  create mode 100644 src/app/views/image_descriptor/summary.haml
> 
> diff --git a/src/app/controllers/image_descriptor_controller.rb 
> b/src/app/controllers/image_descriptor_controller.rb
> index e5a3a2d..532c092 100644
> --- a/src/app/controllers/image_descriptor_controller.rb
> +++ b/src/app/controllers/image_descriptor_controller.rb
> @@ -2,8 +2,6 @@ class ImageDescriptorController < ApplicationController
>    layout :layout
>    before_filter :require_user
>  
> -  TABS = %w(basics services software summary)
> -
>    def layout
>      return "aggregator" unless ajax?
>    end
> @@ -13,46 +11,67 @@ class ImageDescriptorController < ApplicationController
>    end
>  
>    def new
> -    # FIXME: check permission, something like IMAGE_CREATE
> -    if params[:commit] == 'Cancel' or params[:commit] == 'Done'
> +    if params[:cancel]
>        redirect_to :controller => "dashboard", :action => 'index'
> -      return
> -    elsif params[:commit] == 'Build'
> -      @tab = 'summary'
> -      if params[:targets]
> -        params[:targets].each do |target|
> -          ImageDescriptorTarget.new_if_not_exists(:name => target, 
> :image_descriptor_id => params[:image_descriptor][:id], :status => 
> ImageDescriptorTarget::STATE_QUEUED)
> -        end
> -      end
> +    else
> +      @image_descriptor = params[:id] ? ImageDescriptor.find(params[:id]) : 
> ImageDescriptor.new
> +      @image_descriptor.update_xml_attributes!(params[:xml] || {})

This block ^ (2 lines) is repeated several times throughout the
controller.  It would be more DRY to move this into its own method
(maybe private so people cannot call it directly), something like
update_xml(), then put this block in there.

>      end
> +  end
>  
> -    unless @tab
> -      @old_tab = TABS.index(params[:tab]) || nil
> -      next_idx = @old_tab ? @old_tab + (params[:commit] == 'Back' ? -1 : 1) 
> : 0
> -      @tab = (next_idx < 0 || next_idx > TABS.size) ? TABS[0] : 
> TABS[next_idx]
> +  def services
> +    if params[:cancel]
> +      redirect_to :controller => "dashboard", :action => 'index'
> +    else
> +      @image_descriptor = params[:id] ? ImageDescriptor.find(params[:id]) : 
> ImageDescriptor.new
> +      @image_descriptor.update_xml_attributes!(params[:xml] || {})
>      end
> +  end
>  
> -    @image_descriptor = params[:image_descriptor] && 
> params[:image_descriptor][:id] ? 
> ImageDescriptor.find(params[:image_descriptor][:id]) : ImageDescriptor.new
> -    @image_descriptor.update_xml_attributes!(params[:xml] || {})
> +  def software
> +    if params[:cancel]
> +      redirect_to :controller => "dashboard", :action => 'index'
> +    else
> +      @image_descriptor = params[:id] ? ImageDescriptor.find(params[:id]) : 
> ImageDescriptor.new
> +      @image_descriptor.update_xml_attributes!(params[:xml] || {})
> +      @repositories = RepositoryManager.new.repositories
> +      if params[:back]
> +        redirect_to :action => 'new', :id => params[:id]
> +        return
> +      end
> +    end
> +  end
>  
> -    if @tab == 'summary'
> +  def summary
> +    if params[:cancel]
> +      redirect_to :controller => "dashboard", :action => 'index'
> +    else
> +      @image_descriptor = params[:id] ? ImageDescriptor.find(params[:id]) : 
> ImageDescriptor.new
> +      @image_descriptor.update_xml_attributes!(params[:xml] || {})
>        @image_descriptor.complete = true
>        @image_descriptor.save!
> -    end
> -
> -    if @tab == 'software'
> -      @repositories = RepositoryManager.new.repositories
> -    elsif @tab == 'summary'
>        @all_targets = ImageDescriptorTarget.available_targets
> +      if params[:back]
> +        redirect_to :action => 'services', :id => params[:id]
> +        return
> +      end
>      end
>    end
>  
> -  def create
> -    if params[:commit] == 'Cancel'
> -      redirect_to :controller => "image", :action => 'show'
> -      return
> +  def build
> +    if params[:cancel] or params[:done]
> +      redirect_to :controller => "dashboard", :action => 'index'
> +    elsif params[:back]
> +      redirect_to :action => 'software', :id => params[:id]
> +    else
> +      @all_targets = ImageDescriptorTarget.available_targets
> +      if params[:targets]
> +        params[:targets].each do |target|
> +          ImageDescriptorTarget.new_if_not_exists(:name => target, 
> :image_descriptor_id => params[:id], :status => 
> ImageDescriptorTarget::STATE_QUEUED)
> +        end
> +      end
> +      redirect_to :action => 'summary', :id => params[:id]
>      end
> -    redirect_to :action => 'images', :tab => 'show'
>    end
>  
>    def targets
> diff --git a/src/app/views/image_descriptor/_nav.haml 
> b/src/app/views/image_descriptor/_nav.haml
> index c923baf..35cfd02 100644
> --- a/src/app/views/image_descriptor/_nav.haml
> +++ b/src/app/views/image_descriptor/_nav.haml

Up to you if you want to do this, but tsedovic has what I think is a
nice pattern for this, see layouts/_header.haml.  (actually, I think you
do this in another file as well).  Not a huge win I guess, but feels a
little cleaner imho.

> @@ -1,15 +1,15 @@
>  #image_descriptor_nav
>    %h2 Create a New Template Master
>    %ul{:class => 'nav'}
> -    %li{:class => @tab == 'basics' ? 'selected' : nil}
> +    %li{:class => controller.action_name == 'new' ? 'selected' : nil}
>        %h4 BASICS
>        %p Basic RHEL LAMP
> -    %li{:class => @tab == 'services' ? 'selected' : nil}
> +    %li{:class => controller.action_name == 'services' ? 'selected' : nil}
>        %h4 SERVICES
>        %p Add services
> -    %li{:class => @tab == 'software' ? 'selected' : nil}
> +    %li{:class => controller.action_name == 'software' ? 'selected' : nil}
>        %h4 SOFTWARE
>        %p Add software
> -    %li{:class => @tab == 'summary' ? 'selected' : nil}
> +    %li{:class => controller.action_name == 'summary' ? 'selected' : nil}
>        %h4 SUMMARY
>        %p Create images
> diff --git a/src/app/views/image_descriptor/_services.haml 
> b/src/app/views/image_descriptor/_services.haml
> deleted file mode 100644
> index d0ef4af..0000000
> --- a/src/app/views/image_descriptor/_services.haml
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -%ul
> -  %li
> -    %label Storage
> -    = check_box_tag 'xml[services][amazon3_storage]', '1', 
> @image_descriptor.xml.services.include?('amazon3_storage')
> -    = label_tag 'xml[services][amazon3_storage]', 'Enable Amazon S3 
> storage', :class => "plain"
> -    %span Provides cloud aware table storage for both user-data and 
> guest-images and snapshots compatible with Amazon S3, for any (internal &amp; 
> external)cloud deployment
> -  %li
> -    %label Inter-node Messaging
> -    = check_box_tag 'xml[services][inter_node_messaging]', '1', 
> @image_descriptor.xml.services.include?('inter_node_messaging')
> -    = label_tag 'xml[services][inter_node_messaging]', 'Enable inter-node 
> messaging', :class => "plain"
> -    %span Provides cloud aware messaging to facilitate instance-to-instance 
> and instance-to-external communication compatible with Amazon SQS, for any 
> (internal &amp; external)cloud deployment
> -  %li
> -    %label Availbility
> -    = check_box_tag 'xml[services][availbility]', '1', 
> @image_descriptor.xml.services.include?('availbility')
> -    = label_tag 'xml[services][availbility]', 'Enable high availbility 
> services', :class => "plain"
> -    %span Provides REST API's that allow applications and administrators to 
> inspect instances and know the active state and configuration. Choose high 
> availability to actively maintain and manage application availability when 
> run in cloud
> -  %li
> -    %label JBoss
> -    = check_box_tag 'xml[services][jboss]', '1', 
> @image_descriptor.xml.services.include?('jboss')
> -    = label_tag 'xml[services][jboss]', 'Enable JBoss infrastructure', 
> :class => "plain"
> -    %span Provides cloud ready JBoss infrastructure to be run in public and 
> internal clouds
> -  %li
> -    %label Cooling Tower
> -    = check_box_tag 'xml[services][cooling_tower]', '1', 
> @image_descriptor.xml.services.include?('cooling_tower')
> -    = label_tag 'xml[services][cooling_tower]', 'Enable Cooling Tower', 
> :class => "plain"
> -    %span Provides multi-tenant, lightweight container for managing many 
> cloud ready PaaS services inside a single instance
> -
> -
> -.submit
> -  = submit_tag "Cancel"
> -  = submit_tag "Back"
> -  = submit_tag "Next"
> diff --git a/src/app/views/image_descriptor/_software.haml 
> b/src/app/views/image_descriptor/_software.haml
> deleted file mode 100644
> index 5f7f24f..0000000
> --- a/src/app/views/image_descriptor/_software.haml
> +++ /dev/null
> @@ -1,72 +0,0 @@
> -- content_for :scripts do
> -  :javascript
> -    $(document).ready(function() {
> -      $("#dashboard-tabs > ul > li > a").each(function(index) {
> -        var link = $(this).attr("href") + "?ajax=true";
> -        $(this).attr("href", link);
> -      });
> -      $("#dashboard-tabs").tabs({spinner: "Loading..."});
> -
> -      // when JS is enabled, hide the Dashboard content -- it'll be loaded
> -      // by jquery UI tab using ajax
> -      $("#dashboard-content").hide();
> -      #...@image_descriptor.xml.packages.map {|group, pkgs| 
> js_add_group_cmd(group, pkgs)}.join("\n")}
> -    });
> -    function remove_group(ev) {
> -      $(ev.target).parent().remove();
> -    };
> -    function get_repository(ev) {
> -      var rep = $(ev.target).val();
> -      $("#dashboard-tabs > ul > li > a").each(function(index) {
> -        var link = $(this).data('load.tabs');
> -        if (link.search(/repository=[^$&]*/) == -1) {
> -          link = link + "&repository=" + rep;
> -        } else {
> -          link = link.replace(/repository=[^$&]*/, "repository="+rep);
> -        }
> -        $("#dashboard-tabs").tabs('url', index, link);
> -      });
> -      $("#dashboard-tabs").tabs('load', $("#dashboard-tabs").tabs('option', 
> 'selected'));
> -    };
> -    function select_package(group, pkgname, parent) {
> -      if (!parent) parent = $("#selected_packages");
> -      if (parent.find(".pkgname").filter(function() {return $(this).text() 
> == pkgname}).length == 0) {
> -        var node = $("<li><input type=checkbox name='xml[packages][]' 
> value='" + group + '#' + pkgname + "' checked=true><span class='pkgname'>" + 
> pkgname + "</span></li>").appendTo(parent);
> -      }
> -    };
> -    function add_group(name) {
> -      var group = $("<li><span class='group'>" + name + "</span><span 
> class='select' 
> onclick='remove_group(event)'>Remove</span><ul></ul></li>").appendTo("#selected_packages");
> -      return group.find("ul");
> -    };
> -    function select_group(opts) {
> -      var groups = $("#selected_packages li .group").filter(function() 
> {return $(this).text() == opts.group});
> -      //FIXME: if group exists, we abort adding group again, merging is not 
> supported yet
> -      if (groups.length > 0) return;
> -      var group = add_group(opts.group);
> -      for (var i = 0; i < opts.pkgs.length; i++) {
> -        select_package(opts.group, opts.pkgs[i], group);
> -      }
> -    };
> -
> -- menu = [ { :text => "Groups", :action => "repository_packages_by_group" }, 
> |
> -  { :text => "Packages", :action => "repository_packages" }, ] |
> -
> -.pkglist_wrapper
> -  .pkglist
> -    #dashboard-tabs{ :class => "ui-tabs ui-widget ui-widget-content 
> ui-corner-all" }
> -      %ul{ :class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
> ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header" }
> -        - menu.each do |item|
> -          - selection_style = "ui-tabs-selected ui-state-active" if 
> item[:action] == controller.action_name
> -          %li{ :class => "#{selection_style} ui-state-default 
> ui-corner-top", :style => 'clear: none' }
> -            = "<a href=\"#{url_for :controller => "image_descriptor", 
> :action => item[:action] }\"><span>#{item[:text]}</span></a>"
> -        %li{ :class => "select_repository"}
> -          = select_repository_tag(@repositories)
> -  .pkglist{:style => "margin-left: 30px", :class => "left-pkglist"}
> -    %div{:class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
> ui-helper-reset ui-helper-clearfix ui-widget-header"}
> -      Selected packages
> -    %ul{:id => "selected_packages"}
> -
> -.submit
> -  = submit_tag "Cancel"
> -  = submit_tag "Back"
> -  = submit_tag "Next"
> diff --git a/src/app/views/image_descriptor/_summary.haml 
> b/src/app/views/image_descriptor/_summary.haml
> deleted file mode 100644
> index 632669d..0000000
> --- a/src/app/views/image_descriptor/_summary.haml
> +++ /dev/null
> @@ -1,58 +0,0 @@
> -- content_for :scripts do
> -  :javascript
> -    $(document).ready(function() {
> -      var refreshId = setInterval(function() {
> -        $('#image_target_list').load('#{url_for :controller => 
> 'image_descriptor', :action => 'targets', :id => @image_descriptor.id, :ajax 
> => true}');
> -      }, 10000);
> -    });
> -    function toggle_build_form_visibility(ev) {
> -      if ($("#image_build_form").css('display') == 'none') {
> -        $("#image_build_form").css('display', 'block');
> -        $(ev.target).val('Cancel');
> -      } else {
> -        $("#image_build_form").css('display', 'none');
> -        $(ev.target).val('Build Images');
> -      }
> -    }
> -
> -.summary_panel
> -  %ul{:class => 'side_panel'}
> -    %li
> -      BASICS
> -      %label
> -        = @image_descriptor.xml.name
> -      %label
> -        = @image_descriptor.xml.platform
> -      %label
> -        = @image_descriptor.xml.description
> -    %li
> -      SERVICES
> -      - @image_descriptor.xml.services.each do |service|
> -        %label
> -          = service
> -    //FIXME: software could take realy long space
> -    //%li
> -    //  SOFTWARE
> -
> -  %ul{:class => 'main_panel'}
> -    .image_build_panel
> -      %h3
> -        Images
> -        %input{:type => 'button', :value => "Build Images", :style => 
> 'float:right', :onclick => 'toggle_build_form_visibility(event)'}
> -      #image_build_form
> -        %ul
> -          %li
> -            %label Image formats
> -            %ul
> -              - @all_targets.each do |target_id, target|
> -                %li
> -                = check_box_tag 'targets[]', target_id, false
> -                %span
> -                  = target['name']
> -        = submit_tag "Build"
> -    = render :partial => 'targets'
> -
> -.submit
> -  = submit_tag "Cancel"
> -  = submit_tag "Back"
> -  = submit_tag "Done"
> diff --git a/src/app/views/image_descriptor/new.haml 
> b/src/app/views/image_descriptor/new.haml
> index e6f4a3e..5a1adda 100644
> --- a/src/app/views/image_descriptor/new.haml
> +++ b/src/app/views/image_descriptor/new.haml
> @@ -1,9 +1,22 @@
> -= render :partial => "nav", :locals => {:tab => params[:tab]}
> += render :partial => "nav"
>  
>  #image_descriptor_form{:class => 'dcloud_form'}
>    = error_messages_for 'image_descriptor'
>  
> -  - form_tag :action => 'new' do
> -    %input{:type => 'hidden', :name => 'tab', :value => @tab}
> -    = hidden_field :image_descriptor, :id
> -    = render :partial => @tab
> +  - form_for @image_descriptor, :url => {:action => 'services', :id => 
> @image_descriptor.id} do
> +    %ul
> +      %li
> +        %label Name
> +        = text_field_tag 'xml[name]', @image_descriptor.xml.name
> +        %span Provide a unique name for template master. Users will see this 
> name when they choose this image to instantiate.
> +      %li
> +        %label Platform
> +        = select_tag("xml[platform]", 
> @image_descriptor.xml.platforms.map{|repid, rep| "<option value=\"#{repid}\" 
> selected=\"#{repid == @image_descriptor.xml.platform ? 'selected' : 
> ''}\">#{rep['name']}</option>"})
> +        %span Choose the software operating system.
> +      %li
> +        %label Description
> +        = text_area_tag("xml[description]", 
> @image_descriptor.xml.description, :rows => 4)
> +        %span Provide a description of your template master. Be descriptive 
> to help users to identify the images created with this master.
> +    .submit
> +      = submit_tag "Cancel", :name => "cancel"
> +      = submit_tag "Next", :name => "next"
> diff --git a/src/app/views/image_descriptor/services.haml 
> b/src/app/views/image_descriptor/services.haml
> new file mode 100644
> index 0000000..ac169b7
> --- /dev/null
> +++ b/src/app/views/image_descriptor/services.haml
> @@ -0,0 +1,37 @@
> += render :partial => "nav"
> +
> +#image_descriptor_form{:class => 'dcloud_form'}
> +  = error_messages_for 'image_descriptor'
> +
> +  - form_for @image_descriptor, :url => {:action => 'software', :id => 
> @image_descriptor.id} do
> +    = hidden_field :image_descriptor, :id
> +    %ul
> +      %li
> +        %label Storage
> +        = check_box_tag 'xml[services][amazon3_storage]', '1', 
> @image_descriptor.xml.services.include?('amazon3_storage')
> +        = label_tag 'xml[services][amazon3_storage]', 'Enable Amazon S3 
> storage', :class => "plain"
> +        %span Provides cloud aware table storage for both user-data and 
> guest-images and snapshots compatible with Amazon S3, for any (internal &amp; 
> external)cloud deployment
> +      %li
> +        %label Inter-node Messaging
> +        = check_box_tag 'xml[services][inter_node_messaging]', '1', 
> @image_descriptor.xml.services.include?('inter_node_messaging')
> +        = label_tag 'xml[services][inter_node_messaging]', 'Enable 
> inter-node messaging', :class => "plain"
> +        %span Provides cloud aware messaging to facilitate 
> instance-to-instance and instance-to-external communication compatible with 
> Amazon SQS, for any (internal &amp; external)cloud deployment
> +      %li
> +        %label Availbility
> +        = check_box_tag 'xml[services][availbility]', '1', 
> @image_descriptor.xml.services.include?('availbility')
> +        = label_tag 'xml[services][availbility]', 'Enable high availbility 
> services', :class => "plain"

All instances of 'availbility' above should be 'availability'

> +        %span Provides REST API's that allow applications and administrators 
> to inspect instances and know the active state and configuration. Choose high 
> availability to actively maintain and manage application availability when 
> run in cloud
> +      %li
> +        %label JBoss
> +        = check_box_tag 'xml[services][jboss]', '1', 
> @image_descriptor.xml.services.include?('jboss')
> +        = label_tag 'xml[services][jboss]', 'Enable JBoss infrastructure', 
> :class => "plain"
> +        %span Provides cloud ready JBoss infrastructure to be run in public 
> and internal clouds
> +      %li
> +        %label Cooling Tower
> +        = check_box_tag 'xml[services][cooling_tower]', '1', 
> @image_descriptor.xml.services.include?('cooling_tower')
> +        = label_tag 'xml[services][cooling_tower]', 'Enable Cooling Tower', 
> :class => "plain"
> +        %span Provides multi-tenant, lightweight container for managing many 
> cloud ready PaaS services inside a single instance
> +    .submit
> +      = submit_tag "Cancel", :name => "cancel"
> +      = submit_tag "Back", :name => "back"
> +      = submit_tag "Next", :name => "next"
> diff --git a/src/app/views/image_descriptor/software.haml 
> b/src/app/views/image_descriptor/software.haml
> new file mode 100644
> index 0000000..47f377f
> --- /dev/null
> +++ b/src/app/views/image_descriptor/software.haml
> @@ -0,0 +1,78 @@
> +- content_for :scripts do
> +  :javascript
> +    $(document).ready(function() {
> +      $("#dashboard-tabs > ul > li > a").each(function(index) {
> +        var link = $(this).attr("href") + "?ajax=true";
> +        $(this).attr("href", link);
> +      });
> +      $("#dashboard-tabs").tabs({spinner: "Loading..."});
> +
> +      // when JS is enabled, hide the Dashboard content -- it'll be loaded
> +      // by jquery UI tab using ajax
> +      $("#dashboard-content").hide();
> +      #...@image_descriptor.xml.packages.map {|group, pkgs| 
> js_add_group_cmd(group, pkgs)}.join("\n")}
> +    });
> +    function remove_group(ev) {
> +      $(ev.target).parent().remove();
> +    };
> +    function get_repository(ev) {
> +      var rep = $(ev.target).val();
> +      $("#dashboard-tabs > ul > li > a").each(function(index) {
> +        var link = $(this).data('load.tabs');
> +        if (link.search(/repository=[^$&]*/) == -1) {
> +          link = link + "&repository=" + rep;
> +        } else {
> +          link = link.replace(/repository=[^$&]*/, "repository="+rep);
> +        }
> +        $("#dashboard-tabs").tabs('url', index, link);
> +      });
> +      $("#dashboard-tabs").tabs('load', $("#dashboard-tabs").tabs('option', 
> 'selected'));
> +    };
> +    function select_package(group, pkgname, parent) {
> +      if (!parent) parent = $("#selected_packages");
> +      if (parent.find(".pkgname").filter(function() {return $(this).text() 
> == pkgname}).length == 0) {
> +        var node = $("<li><input type=checkbox name='xml[packages][]' 
> value='" + group + '#' + pkgname + "' checked=true><span class='pkgname'>" + 
> pkgname + "</span></li>").appendTo(parent);
> +      }
> +    };
> +    function add_group(name) {
> +      var group = $("<li><span class='group'>" + name + "</span><span 
> class='select' 
> onclick='remove_group(event)'>Remove</span><ul></ul></li>").appendTo("#selected_packages");
> +      return group.find("ul");
> +    };
> +    function select_group(opts) {
> +      var groups = $("#selected_packages li .group").filter(function() 
> {return $(this).text() == opts.group});
> +      //FIXME: if group exists, we abort adding group again, merging is not 
> supported yet
> +      if (groups.length > 0) return;
> +      var group = add_group(opts.group);
> +      for (var i = 0; i < opts.pkgs.length; i++) {
> +        select_package(opts.group, opts.pkgs[i], group);
> +      }
> +    };
> +
> +- menu = [ { :text => "Groups", :action => "repository_packages_by_group" }, 
> |
> +  { :text => "Packages", :action => "repository_packages" }, ] |
> +
> += render :partial => "nav"
> +
> +#image_descriptor_form{:class => 'dcloud_form'}
> +  = error_messages_for 'image_descriptor'
> +
> +  - form_for @image_descriptor, :url => {:action => 'summary', :id => 
> @image_descriptor.id} do
> +    .pkglist_wrapper
> +      .pkglist
> +        #dashboard-tabs{ :class => "ui-tabs ui-widget ui-widget-content 
> ui-corner-all" }
> +          %ul{ :class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
> ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header" }
> +            - menu.each do |item|
> +              - selection_style = "ui-tabs-selected ui-state-active" if 
> item[:action] == controller.action_name
> +              %li{ :class => "#{selection_style} ui-state-default 
> ui-corner-top", :style => 'clear: none' }
> +                = "<a href=\"#{url_for :controller => "image_descriptor", 
> :action => item[:action] }\"><span>#{item[:text]}</span></a>"
> +            %li{ :class => "select_repository"}
> +              = select_repository_tag(@repositories)
> +      .pkglist{:style => "margin-left: 30px", :class => "left-pkglist"}
> +        %div{:class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
> ui-helper-reset ui-helper-clearfix ui-widget-header"}
> +          Selected packages
> +        %ul{:id => "selected_packages"}
> +
> +    .submit
> +      = submit_tag "Cancel", :name => "cancel"
> +      = submit_tag "Back", :name => "back"
> +      = submit_tag "Next", :name => "next"
> diff --git a/src/app/views/image_descriptor/summary.haml 
> b/src/app/views/image_descriptor/summary.haml
> new file mode 100644
> index 0000000..dd8ff1f
> --- /dev/null
> +++ b/src/app/views/image_descriptor/summary.haml
> @@ -0,0 +1,64 @@
> +- content_for :scripts do
> +  :javascript
> +    $(document).ready(function() {
> +      var refreshId = setInterval(function() {
> +        $('#image_target_list').load('#{url_for :controller => 
> 'image_descriptor', :action => 'targets', :id => @image_descriptor.id, :ajax 
> => true}');
> +      }, 10000);
> +    });
> +    function toggle_build_form_visibility(ev) {
> +      if ($("#image_build_form").css('display') == 'none') {
> +        $("#image_build_form").css('display', 'block');
> +        $(ev.target).val('Cancel');
> +      } else {
> +        $("#image_build_form").css('display', 'none');
> +        $(ev.target).val('Build Images');
> +      }
> +    }
> +
> += render :partial => "nav"
> +
> +#image_descriptor_form{:class => 'dcloud_form'}
> +  = error_messages_for 'image_descriptor'
> +
> +  - form_for @image_descriptor, :url => {:action => 'build', :id => 
> @image_descriptor.id} do
> +    .summary_panel
> +      %ul{:class => 'side_panel'}
> +        %li
> +          BASICS
> +          %label
> +            = @image_descriptor.xml.name
> +          %label
> +            = @image_descriptor.xml.platform
> +          %label
> +            = @image_descriptor.xml.description
> +        %li
> +          SERVICES
> +          - @image_descriptor.xml.services.each do |service|
> +            %label
> +              = service
> +        //FIXME: software could take realy long space
> +        //%li
> +        //  SOFTWARE
> +
> +      %ul{:class => 'main_panel'}
> +        .image_build_panel
> +          %h3
> +            Images
> +            %input{:type => 'button', :value => "Build Images", :style => 
> 'float:right', :onclick => 'toggle_build_form_visibility(event)'}
> +          #image_build_form
> +            %ul
> +              %li
> +                %label Image formats
> +                %ul
> +                  - @all_targets.each do |target_id, target|
> +                    %li
> +                    = check_box_tag 'targets[]', target_id, false
> +                    %span
> +                      = target['name']
> +            = submit_tag "Build"
> +        = render :partial => 'targets'
> +
> +    .submit
> +      = submit_tag "Cancel", :name => "cancel"
> +      = submit_tag "Back", :name => "back"
> +      = submit_tag "Done", :name => "done"

Other than those minor notes, ACK

-j

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

Reply via email to