[Ovirt-devel] [PATCH] replaced flexigrid-based display for HW and smart pool storage with tree component.

Jason Guiditta jguiditt at redhat.com
Tue Nov 18 21:39:21 UTC 2008


Overall works well for me, some comments inline, plus that bit of
filtering we discussed in irc - lvm volumes should be filtered from add
storage list.

On Tue, 2008-11-18 at 05:35 +0000, Scott Seago wrote:
> Signed-off-by: Scott Seago <sseago at redhat.com>
> ---
>  src/app/controllers/hardware_controller.rb    |    3 +-
>  src/app/controllers/search_controller.rb      |   41 ++++++---
>  src/app/controllers/smart_pools_controller.rb |    1 +
>  src/app/controllers/storage_controller.rb     |    2 +-
>  src/app/models/smart_pool.rb                  |   20 ++++
>  src/app/models/storage_pool.rb                |    3 +-
>  src/app/models/storage_volume.rb              |    7 +-
>  src/app/views/hardware/show_storage.rhtml     |   64 +++++++++----
>  src/app/views/smart_pools/show_storage.rhtml  |   63 +++++++++----
>  src/app/views/storage/show.rhtml              |   40 --------
>  src/app/views/storage/show_volume.rhtml       |  127 +++++++++----------------
>  src/public/javascripts/ovirt.js               |    3 +-
>  12 files changed, 200 insertions(+), 174 deletions(-)
> 
> diff --git a/src/app/controllers/hardware_controller.rb b/src/app/controllers/hardware_controller.rb
> index 8c26184..4dda736 100644
> --- a/src/app/controllers/hardware_controller.rb
> +++ b/src/app/controllers/hardware_controller.rb
> @@ -111,6 +111,7 @@ class HardwareController < PoolController
>    end
>  
>    def show_storage
> +    @storage_tree = @pool.storage_tree(:filter_unavailable => false, :include_used => true).to_json
>      show
>    end
>  
> @@ -171,7 +172,7 @@ class HardwareController < PoolController
>        id = params[:exclude_pool]
>        storage_pools = StoragePool
>        find_opts = {:include => :hardware_pool,
> -        :conditions => ["pools.id != ?", id]}
> +        :conditions => ["(storage_pools.type != 'LvmStoragePool') and (pools.id != ?)", id]}
>        include_pool = true
>      end
>      super(:full_items => storage_pools,:include_pool => include_pool,:find_opts => find_opts)
> diff --git a/src/app/controllers/search_controller.rb b/src/app/controllers/search_controller.rb
> index 3789309..7551242 100644
> --- a/src/app/controllers/search_controller.rb
> +++ b/src/app/controllers/search_controller.rb
> @@ -19,18 +19,33 @@
>  
>  class SearchController < ApplicationController
>  
> -  MODELS = {"HardwarePool"     => {:controller => "hardware",
> -                                   :show_action => "quick_summary"},
> -            "VmResourcePool"   => {:controller => "resources",
> -                                   :show_action => "quick_summary"},
> -            "Host"             => {:controller => "host",
> -                                   :show_action => "show"},
> -            "Vm"               => {:controller => "vm",
> -                                   :show_action => "show"},
> -            "IscsiStoragePool" => {:controller => "storage",
> -                                   :show_action => "show"},
> -            "NfsStoragePool"   => {:controller => "storage",
> -                                 :show_action => "show"}}
> +  MODELS = {"HardwarePool"       => {:controller => "hardware",
> +                                     :show_action => "quick_summary",
> +                                     :searched => true},
> +            "VmResourcePool"     => {:controller => "resources",
> +                                     :show_action => "quick_summary",
> +                                     :searched => true},
> +            "Host"               => {:controller => "host",
> +                                     :show_action => "show",
> +                                     :searched => true},
> +            "Vm"                 => {:controller => "vm",
> +                                     :show_action => "show",
> +                                     :searched => true},
> +            "IscsiStoragePool"   => {:controller => "storage",
> +                                     :show_action => "show",
> +                                     :searched => true},
> +            "NfsStoragePool"     => {:controller => "storage",
> +                                     :show_action => "show",
> +                                     :searched => true},
> +            "IscsiStorageVolume" => {:controller => "storage",
> +                                     :show_action => "show_volume",
> +                                     :searched => false},
> +            "NfsStorageVolume"   => {:controller => "storage",
> +                                     :show_action => "show_volume",
> +                                     :searched => false},
> +            "LvmStorageVolume"   => {:controller => "storage",
> +                                     :show_action => "show_volume",
> +                                     :searched => false}}
>  
>    MULTI_TYPE_MODELS = {"StoragePool" => ["IscsiStoragePool", "NfsStoragePool"]}
>  
> @@ -50,7 +65,7 @@ class SearchController < ApplicationController
>      @model_param ||= ""
>  
>      if @model_param == ""
> -      @models = MODELS.keys
> +      @models = MODELS.keys.select {|model| MODELS[model][:searched]}
>      else
>        @models = MULTI_TYPE_MODELS[@model_param]
>        @models ||= [@model_param]
> diff --git a/src/app/controllers/smart_pools_controller.rb b/src/app/controllers/smart_pools_controller.rb
> index 0295b63..37ccdad 100644
> --- a/src/app/controllers/smart_pools_controller.rb
> +++ b/src/app/controllers/smart_pools_controller.rb
> @@ -38,6 +38,7 @@ class SmartPoolsController < PoolController
>    end
>  
>    def show_storage
> +    @storage_tree = @pool.storage_tree(:filter_unavailable => false, :include_used => true).to_json
>      show
>    end
>  
> diff --git a/src/app/controllers/storage_controller.rb b/src/app/controllers/storage_controller.rb
> index e3e5522..6e6e3c2 100644
> --- a/src/app/controllers/storage_controller.rb
> +++ b/src/app/controllers/storage_controller.rb
> @@ -107,7 +107,7 @@ class StorageController < ApplicationController
>        end
>      else
>        respond_to do |format|
> -        format.html { render :layout => 'popup' }
> +        format.html { render :layout => 'selection' }
>          format.xml { render :xml => @storage_volume.to_xml }
>        end
>      end
> diff --git a/src/app/models/smart_pool.rb b/src/app/models/smart_pool.rb
> index ac6db5e..772ffef 100644
> --- a/src/app/models/smart_pool.rb
> +++ b/src/app/models/smart_pool.rb
> @@ -97,4 +97,24 @@ class SmartPool < Pool
>      user_pools[-1] << "break" unless user_pools.empty?
>      user_pools + other_pools
>    end
Excellent to see documentation of code, makes it so much easier to
understand
> +
> +  # params accepted:
> +  # :vm_to_include - if specified, storage used by this VM is included in the tree
> +  # :filter_unavailable - if true, don't include Storage not currently available
> +  # :include_used - include all storage pools/volumes, even those in use
> +  # for smart pools,  filter_unavailable defaults to false and include_used to true
> +  def storage_tree(params = {})
> +    vm_to_include=params.fetch(:vm_to_include, nil)
> +    filter_unavailable = params.fetch(:filter_unavailable, false)
> +    include_used = params.fetch(:include_used, true)
> +    conditions = "type != 'LvmStoragePool'"
> +    if filter_unavailable
> +      conditions = "(#{conditions}) and (storage_pools.state = '#{StoragePool::STATE_AVAILABLE}')"
> +    end
> +    tagged_storage_pools.find(:all,
> +                    :conditions => conditions).collect do |pool|
> +      pool.storage_tree_element(params)
> +    end
> +  end
> +
>  end
> diff --git a/src/app/models/storage_pool.rb b/src/app/models/storage_pool.rb
> index 9c80f54..bab7031 100644
> --- a/src/app/models/storage_pool.rb
> +++ b/src/app/models/storage_pool.rb
> @@ -97,7 +97,8 @@ class StoragePool < ActiveRecord::Base
>        :name => display_name,
>        :available => false,
>        :create_volume => user_subdividable,
> -      :selected => false}
> +      :selected => false,
> +      :is_pool => true}
>      conditions = nil
>      unless include_used
>        conditions = "vms.id is null"
> diff --git a/src/app/models/storage_volume.rb b/src/app/models/storage_volume.rb
> index 56cdcef..39b72d5 100644
> --- a/src/app/models/storage_volume.rb
> +++ b/src/app/models/storage_volume.rb
> @@ -80,6 +80,10 @@ class StorageVolume < ActiveRecord::Base
>      return false
>    end
>  
> +  def deletable
> +    storage_pool.user_subdividable and vms.empty? and (lvm_storage_pool.nil? or lvm_storage_pool.storage_volumes.empty?)
> +  end
> +
>    def storage_tree_element(params = {})
>      vm_to_include=params.fetch(:vm_to_include, nil)
>      filter_unavailable = params.fetch(:filter_unavailable, true)
> @@ -95,7 +99,8 @@ class StorageVolume < ActiveRecord::Base
>                       vm_ids.include?(vm_to_include.id))),
>        :create_volume => supports_lvm_subdivision,
>        :selected => (!vm_ids.empty? and vm_to_include and vm_to_include.id and
> -                   (vm_ids.include?(vm_to_include.id)))}
> +                   (vm_ids.include?(vm_to_include.id))),
> +      :is_pool => false}
>      if lvm_storage_pool
>        if return_hash[:available]
>          return_hash[:available] = lvm_storage_pool.storage_volumes.full_vm_list.empty?
> diff --git a/src/app/views/hardware/show_storage.rhtml b/src/app/views/hardware/show_storage.rhtml
> index 5ade456..6a91161 100644
> --- a/src/app/views/hardware/show_storage.rhtml
> +++ b/src/app/views/hardware/show_storage.rhtml
> @@ -1,5 +1,5 @@
>  <div id="toolbar_nav">
> -<ul>
> + <ul>
>      <li><a href="<%= url_for :controller => 'storage', :action => 'addstorage', :hardware_pool_id => @pool %>" rel="facebox[.bolder]"><%= image_tag "icon_addstorage.png", :style => "vertical-align:middle;" %>  Add Storage Server</a></li>
>      <li>
>        <a href="#" onClick="return validate_storage_for_move();" ><%= image_tag "icon_move.png", :style=>"vertical-align:middle;" %>  Move</a>
> @@ -27,7 +27,40 @@
>    </ul>
>  </div>
>  
> +<textarea id="tree_template" style="display:none;">
> +{macro htmlList(list, isFullList)}
> +  {if isFullList}
> +  <ul style="display:none;">
> +  {/if}
> +    {for item in list}
> +      <li>
> +        <span class="hitarea {if item.children.length > 0} expandable{/if}"> </span>
> +        <div id="tree-${item.type}_${item.id}">
> +          <input class="grid_checkbox" type="checkbox"
> +            name="grid_checkbox${item.type}_${item.id}"
> +            value="${item.id}"
> +            {if !item.is_pool}disabled="disabled" style="display:none"{/if}
> +            {if item.selected}checked="checked"{/if}/> ${item.name} {if item.size}(${item.size} GB){/if}
> +        </div>
> +        {if item.children.length > 0}
> +          ${htmlList(item.children, true)}
> +        {/if}
> +      </li>
> +    {/for}
> +  {if isFullList}
> +  </ul>
> +  {/if}
> +{/macro}
> +
> +${htmlList(pools)}
> +</textarea>
>  <script type="text/javascript">
> +  $(document).ready(function(){
> +    $('#storage_tree').tree({
> +      content: {"pools" : <%=  @storage_tree%>},
> +      clickHandler: storage_select
> +    });
> +  });
>    function add_storage_to_smart_pool(smart_pool)
>    {
>      var storage = get_selected_storage();
> @@ -35,7 +68,8 @@
>        $.post('<%= url_for :controller => "smart_pools", :action => "add_storage" %>',
>               { resource_ids: storage.toString(), id: smart_pool },
>               function(data,status){
> -               $('#storage_grid').flexReload();
> +               // FIXME: reload #storage_tree
> +               //$('#storage_grid').flexReload();
I don't think we really need to keep this line ^^
>                 if (data.alert) {
>                   $.jGrowl(data.alert);
>                 }
> @@ -76,28 +110,24 @@
>                 }, 'json');
>      }
>    }
> -  function storage_select(selected_rows)
> +  function storage_select(e, elem)
>    {
> -    var selected_ids = new Array();
> -    for(i=0; i<selected_rows.length; i++) {
> -      selected_ids[i] = selected_rows[i].id;
> -    }
> -    if (selected_ids.length == 1)
> -    {
> -      $('#storage_selection').load('<%= url_for :controller => "storage", :action => "show" %>',
> -                { id: parseInt(selected_ids[0].substring(3))});
> -    }
> +    $('#storage_tree_form ul.ovirt-tree li div').removeClass('current');
> +    $(elem)
> +      .addClass('current');
> +    $('#storage_selection').load('<%= url_for :controller => "search", :action => "single_result" %>',
> +                { class_and_id: elem.id.substring(5)});
As discussed in irc, let's switch any #s here to use indexOf(char) as
the endpoint.
>    }
>  
>  </script>
>  <div class="panel_header"></div>
>  <% if @pool.storage_pools.size != 0 %>
>    <div class="data_section">
> -       <%= render :partial => "/storage/grid", :locals => { :table_id => "storage_grid",
> -                                                            :hwpool => @pool,
> -                                                            :exclude_pool => nil,
> -                                                            :on_select => "storage_select",
> -                                                            :is_popup => false} %>
> +    <div style="overflow:auto; border:#CCCCCC solid 1px;">
Please extract this style into a class
> +      <form id="storage_tree_form">
> +        <ul id="storage_tree" class="ovirt-tree"></ul>
> +      </form>
> +    </div>
>    </div>
>  
>    <div class="selection_detail" id="storage_selection">
> diff --git a/src/app/views/smart_pools/show_storage.rhtml b/src/app/views/smart_pools/show_storage.rhtml
> index 7cf425a..9a9b78e 100644
> --- a/src/app/views/smart_pools/show_storage.rhtml
> +++ b/src/app/views/smart_pools/show_storage.rhtml
> @@ -5,10 +5,44 @@
>    </ul>
>  </div>
>  
> +<textarea id="tree_template" style="display:none;">
> +{macro htmlList(list, isFullList)}
> +  {if isFullList}
> +  <ul style="display:none;">
> +  {/if}
> +    {for item in list}
> +      <li>
> +        <span class="hitarea {if item.children.length > 0} expandable{/if}"> </span>
> +        <div id="tree-${item.type}_${item.id}">
> +          <input class="grid_checkbox" type="checkbox"
> +            name="grid_checkbox${item.type}_${item.id}"
> +            value="${item.id}"
> +            {if !item.is_pool}disabled="disabled" style="display:none"{/if}
> +            {if item.selected}checked="checked"{/if}/> ${item.name} {if item.size}(${item.size} GB){/if}
> +        </div>
> +        {if item.children.length > 0}
> +          ${htmlList(item.children, true)}
> +        {/if}
> +      </li>
> +    {/for}
> +  {if isFullList}
> +  </ul>
> +  {/if}
> +{/macro}
> +
> +${htmlList(pools)}
> +</textarea>
> +
>  <script type="text/javascript">
> +  $(document).ready(function(){
> +    $('#smart_storage_tree').tree({
> +      content: {"pools" : <%=  @storage_tree%>},
> +      clickHandler: smart_storage_select
> +    });
> +  });
>    function get_selected_storage_for_smart_pool()
>    {
> -    return get_selected_checkboxes("smart_storage_grid_form");
> +    return get_selected_checkboxes("smart_storage_tree_form");
>    }
>    function remove_storage_from_smart_pool()
>    {
> @@ -27,29 +61,24 @@
>                 }, 'json');
>      }
>    }
> -  function smart_storage_select(selected_rows)
> +  function smart_storage_select(e, elem)
>    {
> -    var selected_ids = new Array() ;
> -    for(i=0; i<selected_rows.length; i++) {
> -      selected_ids[i] = selected_rows[i].id;
> -    }
> -    if (selected_ids.length == 1)
> -    {
> -      $('#smart_storage_selection').load('<%= url_for :controller => "storage", :action => "show" %>',
> -                { id: parseInt(selected_ids[0].substring(3))});
> -    }
> +    $('#smart_storage_tree_form ul.ovirt-tree li div').removeClass('current');
> +    $(elem)
> +      .addClass('current');
> +    $('#smart_storage_selection').load('<%= url_for :controller => "search", :action => "single_result" %>',
> +                { class_and_id: elem.id.substring(5)});
Switch to indexOf, same as above
>    }
>  
>  </script>
>  <div class="panel_header"></div>
>  <% if @pool.tagged_storage_pools.size != 0 %>
>    <div class="data_section">
> -       <%= render :partial => "/storage/grid", :locals => { :table_id => "smart_storage_grid",
> -                                                            :hwpool => @pool,
> -                                                            :pool_controller => "smart_pools",
> -                                                            :exclude_pool => nil,
> -                                                            :on_select => "smart_storage_select",
> -                                                            :is_popup => false} %>
> +    <div style="overflow:auto; border:#CCCCCC solid 1px;">
css class
> +      <form id="smart_storage_tree_form">
> +        <ul id="smart_storage_tree" class="ovirt-tree"></ul>
> +      </form>
> +    </div>
>    </div>
>  
>    <div class="selection_detail" id="smart_storage_selection">
> diff --git a/src/app/views/storage/show.rhtml b/src/app/views/storage/show.rhtml
> index 123cf20..a4cc1c2 100644
> --- a/src/app/views/storage/show.rhtml
> +++ b/src/app/views/storage/show.rhtml
> @@ -40,51 +40,11 @@
>          <%=h @storage_pool.state %><br/>
>      </div>
>  <%- content_for :right do -%>
> -  <div class="selection_right_title">Volumes</div>
> -<!-- hide for now
> -        	<ul class="selection_tab_nav">
> -            	<li><a href="#"><%=image_tag "icon_selection_add.gif", :style=>"vertical-align:middle;" %>Add</a></li>
> -            	<li><a href="#"><%=image_tag "icon_selection_showdetail.gif", :style=>"vertical-align:middle;" %>Show Detail</a></li>
> -            	<li><a href="#"><%=image_tag "icon_selection_remove.gif", :style=>"vertical-align:middle;" %>Remove</a></li>
> -            </ul>
> --->
> -  <div class="selection_right_table">
> -    <table id="storage_volumes_grid" style="display:none"></table>
> -  </div>
>  
>  <%- end -%>
>  
>  <%= confirmation_dialog("confirm_delete_storage", "Are you sure?", "delete_storage_pool()") %>
>  <script type="text/javascript">
> -    $("#storage_volumes_grid").flexigrid
> -    (
> -    {
> -    url: '<%=  url_for :action => "storage_volumes_json", :id => @storage_pool.id %>',
> -    dataType: 'json',
> -    colModel : [
> -        <%= "{display: '', width : 20, align: 'left', process: storage_volumes_gridcheckbox}," if (@storage_pool.user_subdividable and @can_modify) %>
> -        {display: 'Alias', width : 180, sortable : false, align: 'left', process: storage_volume_details_link},
> -        {display: 'Size (Gb)', name : 'size', width : 80, sortable : true, align: 'left'},
> -        {display: 'Type', name : 'type', width : 80, sortable : true, align: 'left'}
> -        ],
> -    sortname: "size",
> -    sortorder: "desc",
> -    usepager: false,
> -    useRp: true,
> -    rp: 40,
> -    showTableToggleBtn: true,
> -    }
> -	);   
> -    function storage_volumes_gridcheckbox(celDiv)
> -    {
> -        $(celDiv).html('<input class="grid_checkbox" type="checkbox" name="grid_checkbox'+$(celDiv).html()+'" value="'+$(celDiv).html()+'"/>');
> -    }
> -    function storage_volume_details_link(celDiv,pid)
> -    {
> -        $(celDiv).html('<a href="<%= url_for :controller => 'storage', :action => 'show_volume' %>/'+ pid +'" rel="facebox[.bolder]">' + $(celDiv).html() + '</a>');
> -    }
> -</script>
> -<script type="text/javascript">
>        
>    function refresh_storage_pool()
>    {
> diff --git a/src/app/views/storage/show_volume.rhtml b/src/app/views/storage/show_volume.rhtml
> index c1cb66a..c1138f4 100644
> --- a/src/app/views/storage/show_volume.rhtml
> +++ b/src/app/views/storage/show_volume.rhtml
> @@ -1,26 +1,27 @@
>  <%- content_for :title do -%>
>    <%=h @storage_volume.display_name %>
>  <%- end -%>
> -<%- content_for :description do -%>
> -  Details for Storage Volume <%=h @storage_volume.display_name %>
> +
> +<%- content_for :action_links do -%>
> +  <%if @can_modify -%>
> +    <%if @storage_volume.supports_lvm_subdivision and @storage_volume.vms.empty? -%>
> +      <%= link_to image_tag("icon_addstorage.png") + " Add new Volume",
> +                            {:controller => 'storage', :action => 'new_lvm_volume', :source_volume_id => @storage_volume.id},
> +                             :rel=>"facebox[.bolder]", :class=>"selection_facebox" %>
> +    <% end %>
> +    <%if @storage_volume.deletable -%>
> +      <a href="#confirm_delete"  rel="facebox[.bolder]">
> +        <%= image_tag "icon_x.png" %> Delete
> +      </a>
> +    <%- end -%>
> +  <%- end -%>
>  <%- end -%>
> +<%= confirmation_dialog("confirm_delete", "Are you sure?", "delete_volume()") %>
>  
> -<% if @storage_volume.supports_lvm_subdivision %>
> -  <div id="dialog-content-area">
> -    <div id="toolbar_nav">
> -      <ul>
> -        <li><a href="#" id="new_lvm_volume_button"><%=image_tag "icon_addstorage.png", :style=>"vertical-align:middle;" %>Add</a></li>
> -        <% if (@storage_volume.lvm_storage_pool and
> -               !@storage_volume.lvm_storage_pool.storage_volumes.empty?) %>
> -          <li><a href="#" onClick="return remove_lvm_volumes();"><%=image_tag "icon_remove.png" %>  Remove</a></li>
> -        <% end %>
> -      </ul>
> -     </div>
> -   </div>
> -<% end %>
> -<div class="panel_header"></div>
>    <div class="selection_key">
> -    IP address:<br/>
> +    <% unless @storage_volume.storage_pool[:type] == "LvmStoragePool" %>
> +      IP address:<br/>
> +    <% end %>
>      <% if @storage_volume.storage_pool[:type] == "IscsiStoragePool" %>
>        Port:<br/>
>        Target:<br/>
> @@ -34,12 +35,18 @@
>        LUN:<br/>
>      <% elsif @storage_volume[:type] == "NfsStorageVolume" %>
>        Filename:<br/>
> +    <% elsif @storage_volume[:type] == "LvmStorageVolume" %>
> +      Volume Group:<br/>
> +      Logical Volume:<br/>
> +      Permissions (owner/group/mode):<br/>
>      <% end %>
>      Size:<br/>
>    </div>
>    <div class="selection_value">
> -    <%=h @storage_volume.storage_pool.ip_addr %><br/>
> -    <% if @storage_volume.storage_pool[:type] == "IscsiStoragePool" %>
> +    <% unless @storage_volume.storage_pool[:type] == "LvmStoragePool" %>
> +      <%=h @storage_volume.storage_pool.ip_addr %><br/>
> +    <% end %>
> +   <% if @storage_volume.storage_pool[:type] == "IscsiStoragePool" %>
>        <%=h @storage_volume.storage_pool.port %><br/>
>        <%=h @storage_volume.storage_pool[:target] %><br/>
>      <% elsif @storage_volume.storage_pool[:type] == "NfsStoragePool" %>
> @@ -52,74 +59,30 @@
>        <%=h @storage_volume.lun %><br/>
>      <% elsif @storage_volume[:type] == "NfsStorageVolume" %>
>        <%=h @storage_volume.filename %><br/>
> +    <% elsif @storage_volume[:type] == "LvmStorageVolume" %>
> +      <%=h @storage_volume.storage_pool.vg_name %><br/>
> +      <%=h @storage_volume.lv_name %><br/>
> +      <%=h @storage_volume.lv_owner_perms %>/<%=h @storage_volume.lv_group_perms %>/<%=h @storage_volume.lv_mode_perms %><br/>
>      <% end %>
>      <%=h @storage_volume.size_in_gb %> GB<br/>
>    </div>
> -<% if @storage_volume.supports_lvm_subdivision %>
> -  <div class="dialog_form">
> -    <div class="form_heading">LVM Volumes</div>
> -    <% if @storage_volume.lvm_storage_pool %>
> -      <form id="lvm_storage_volumes_grid_form">
> -        <table id="lvm_storage_volumes_grid" style="display:none"></table>
> -      </form>
> -    <% end %>
> -  </div>
> -<% end %>
> +<%- content_for :right do -%>
> +
> +<%- end -%>
>  
> -<div class="facebox_timfooter">
> -        <div class="button">
> -          <div class="button_left_grey"></div>
> -          <div class="button_middle_grey"><a href="#" onclick="jQuery(document).trigger('close.facebox')">Close</a></div>
> -          <div class="button_right_grey"></div>
> -        </div>
> -</div>
>  <script type="text/javascript">
> -    $("#lvm_storage_volumes_grid").flexigrid
> -    (
> -    {
> -    url: '<%=  url_for :action => "storage_volumes_json", :id => @storage_volume.lvm_storage_pool.id %>',
> -    dataType: 'json',
> -    colModel : [
> -        <%= "{display: '', width : 20, align: 'left', process: lvm_storage_volumes_gridcheckbox}," if @can_modify %>
> -        {display: 'Alias', width : 180, sortable : false, align: 'left'},
> -        {display: 'Size (Gb)', name : 'size', width : 80, sortable : true, align: 'left'},
> -        {display: 'Type', name : 'type', width : 80, sortable : true, align: 'left'}
> -        ],
> -    sortname: "size",
> -    sortorder: "desc",
> -    usepager: false,
> -    useRp: true,
> -    rp: 40,
> -    showTableToggleBtn: true,
> -    }
> -    );
> -    function lvm_storage_volumes_gridcheckbox(celDiv)
> -    {
> -        $(celDiv).html('<input class="grid_checkbox" type="checkbox" name="grid_checkbox'+$(celDiv).html()+'" value="'+$(celDiv).html()+'"/>');
> -    }
> -  function get_selected_lvm_volumes()
> -  {
> -    return get_selected_checkboxes("lvm_storage_volumes_grid_form");
> -  }
> -  function remove_lvm_volumes()
> +  function delete_volume()
>    {
> -    var volumes = get_selected_lvm_volumes();
> -    if (validate_selected(volumes, "storage volume")) {
> -      $.post('<%= url_for :controller => "storage", :action => "delete_volumes" %>',
> -             { storage_volume_ids: volumes.toString() },
> -              function(data,status){
> -                $("#lvm_storage_volumes_grid").flexReload();
> -		if (data.alert) {
> -		  $.jGrowl(data.alert);
> -                }
> -               }, 'json');
> -    }
> +    $(document).trigger('close.facebox');
> +    $.post('<%= url_for :controller => "storage", :action => "delete_volumes" %>',
> +           { storage_volume_ids: <%= @storage_volume.id %> },
> +            function(data,status) {
> +              // FIXME: reload tree
> +              //$("#vms_grid").flexReload();
I don't think we really need to keep this line ^^
> +              if (data.alert) {
> +                $.jGrowl(data.alert);
> +              }
> +	      empty_summary('storage_selection', 'Storage Pool or Volume');
> +            }, 'json');
>    }
> -$('#new_lvm_volume_button').click(function(){
> -		$('#window').fadeOut('fast');
> -        $("#window").empty().load("<%= url_for :controller => 'storage', :action => 'new_lvm_volume' %>",
> -	{ source_volume_id: <%=@storage_volume.id%>,
> -          return_facebox: '<%= url_for :controller => 'storage', :action => 'show_volume', :id => @storage_volume.id %>' });
> -		$('#window').fadeIn('fast');
> -});
>  </script>
> diff --git a/src/public/javascripts/ovirt.js b/src/public/javascripts/ovirt.js
> index d84b3d9..e0e3dc8 100644
> --- a/src/public/javascripts/ovirt.js
> +++ b/src/public/javascripts/ovirt.js
> @@ -62,6 +62,7 @@ function add_storage(url)
>               { resource_ids: storage.toString() },
>                function(data,status){;
>                  $(document).trigger('close.facebox');
> +                // FIXME: this always reloads the tab for now
>  	        grid = $("#storage_grid");
>                  if (grid.size()>0 && grid != null) {
>                    grid.flexReload();
> @@ -256,7 +257,7 @@ function empty_summary(element_id, label){
>  
>  function get_selected_storage()
>  {
> -    return get_selected_checkboxes("storage_grid_form");
> +    return get_selected_checkboxes("storage_tree_form");
>  }
>  function validate_storage_for_move()
>  {




More information about the ovirt-devel mailing list