[Ovirt-devel] [Patch] HW pool quota add/edit/delete/view
Hugh O. Brock
hbrock at redhat.com
Fri May 30 17:15:26 UTC 2008
On Fri, May 30, 2008 at 12:43:28PM -0400, Scott Seago wrote:
>
> >From f76391b8b1b2e21875fdb3cb8c541e6a70ecb7ee Mon Sep 17 00:00:00 2001
> From: Scott Seago <sseago at redhat.com>
> Date: Fri, 30 May 2008 12:39:40 -0400
> Subject: [PATCH] added default quota to HW pool form. it can be edited/deleted too...
>
>
> Signed-off-by: Scott Seago <sseago at redhat.com>
> ---
> wui/src/app/controllers/hardware_controller.rb | 10 +++
> wui/src/app/controllers/quota_controller.rb | 38 +++++++-----
> wui/src/app/helpers/application_helper.rb | 1 -
> wui/src/app/views/hardware/quick_summary.rhtml | 56 ++++++++++++++++++
> wui/src/app/views/hardware/show.html.erb | 15 +++++
> wui/src/app/views/host/show.rhtml | 13 +++--
> wui/src/app/views/layouts/redux.rhtml | 5 +-
> wui/src/app/views/layouts/selection.rhtml | 28 ++++++++-
> wui/src/app/views/quota/_form.rhtml | 2 +-
> wui/src/app/views/quota/edit.rhtml | 68 +++++++++++-----------
> wui/src/app/views/quota/new.rhtml | 71 +++++++++++------------
> wui/src/app/views/resources/quick_summary.rhtml | 8 +-
> wui/src/app/views/resources/show.rhtml | 9 ++-
> wui/src/public/images/icon_edit.png | Bin 0 -> 375 bytes
> wui/src/public/images/icon_separator.png | Bin 0 -> 216 bytes
> wui/src/public/images/icon_x.png | Bin 0 -> 340 bytes
> wui/src/public/javascripts/ovirt.js | 12 ++++
> wui/src/public/stylesheets/layout.css | 31 ++++++++++
> 18 files changed, 260 insertions(+), 107 deletions(-)
> create mode 100644 wui/src/app/views/hardware/quick_summary.rhtml
> create mode 100644 wui/src/public/images/icon_edit.png
> create mode 100644 wui/src/public/images/icon_separator.png
> create mode 100644 wui/src/public/images/icon_x.png
>
> diff --git a/wui/src/app/controllers/hardware_controller.rb b/wui/src/app/controllers/hardware_controller.rb
> index 0f0c904..0eaf76f 100644
> --- a/wui/src/app/controllers/hardware_controller.rb
> +++ b/wui/src/app/controllers/hardware_controller.rb
> @@ -225,6 +225,16 @@ class HardwareController < ApplicationController
> render :json => graph_object
> end
>
> + def quick_summary
> + pre_show
> + set_perms(@perm_obj)
> + unless @can_view
> + flash[:notice] = 'You do not have permission to view this Hardware Pool: redirecting to top level'
> + redirect_to :action => 'list'
> + end
> + render :layout => 'selection'
> + end
> +
> def hosts_json
> if params[:id]
> pre_json
> diff --git a/wui/src/app/controllers/quota_controller.rb b/wui/src/app/controllers/quota_controller.rb
> index d865529..cfedf2d 100644
> --- a/wui/src/app/controllers/quota_controller.rb
> +++ b/wui/src/app/controllers/quota_controller.rb
> @@ -38,39 +38,45 @@ class QuotaController < ApplicationController
> end
>
> def new
> + render :layout => 'popup'
> end
>
> def create
> - if @quota.save
> - flash[:notice] = 'Quota was successfully created.'
> - redirect_to_parent
> - else
> - render :action => 'new'
> + begin
> + @quota.save!
> + render :json => { :object => "quota", :success => true,
> + :alert => "Quota was successfully created." }
> + rescue
> + render :json => { :object => "quota", :success => false,
> + :errors => @quota.errors.localize_error_messages.to_a}
> end
> end
>
> def edit
> + render :layout => 'popup'
> end
>
> def update
> - if @quota.update_attributes(params[:quota])
> - flash[:notice] = 'Quota was successfully updated.'
> - redirect_to_parent
> - else
> - render :action => 'edit'
> + begin
> + @quota.update_attributes!(params[:quota])
> + render :json => { :object => "quota", :success => true,
> + :alert => "Quota was successfully updated." }
> + rescue
> + render :json => { :object => "quota", :success => false,
> + :errors => @quota.errors.localize_error_messages.to_a}
> end
> end
>
> def destroy
> pool = @quota.pool
> - unless @quota.destroy
> - flash[:notice] = 'destroying quota failed '
> - end
> - if pool
> - redirect_to :controller => pool.get_controller, :action => 'show', :id => pool.id
> + if @quota.destroy
> + alert="Quota was successfully deleted."
> + success=true
> else
> - redirect_to :controller => 'dashboard'
> + alert="Failed to delete quota."
> + success=false
> end
> + render :json => { :object => "quota", :success => success, :alert => alert }
> end
>
> protected
> diff --git a/wui/src/app/helpers/application_helper.rb b/wui/src/app/helpers/application_helper.rb
> index 20c344f..75b6195 100644
> --- a/wui/src/app/helpers/application_helper.rb
> +++ b/wui/src/app/helpers/application_helper.rb
> @@ -106,7 +106,6 @@ module ApplicationHelper
> }
> end
>
> -
> def timeout_flash(name)
> %{
> <script type="text/javascript">
> diff --git a/wui/src/app/views/hardware/quick_summary.rhtml b/wui/src/app/views/hardware/quick_summary.rhtml
> new file mode 100644
> index 0000000..efcdb01
> --- /dev/null
> +++ b/wui/src/app/views/hardware/quick_summary.rhtml
> @@ -0,0 +1,56 @@
> +<%- content_for :title do -%>
> + Default quota for <%=h @pool.name %>
> +<%- end -%>
> +<%- content_for :action_links do -%>
> + <%if @can_modify -%>
> + <%if @pool.quota -%>
> + <%= link_to image_tag("icon_edit.png") + " Edit Default Quota",
> + {:controller => 'quota', :action => 'edit', :id => @pool.quota},
> + :rel=>"facebox[.bolder]" %>
> + <a href="#" onClick="delete_default_quota()">
> + <%= image_tag "icon_x.png" %> Remove Default Quota
> + </a>
> + <% else -%>
> + <%= link_to image_tag("icon_edit.png") + " Edit Default Quota",
> + {:controller => 'quota', :action => 'new', :pool_id => @pool },
> + :rel=>"facebox[.bolder]" %>
> + <% end -%>
> + <% end -%>
> +<% end -%>
> +<script type="text/javascript">
> + function delete_default_quota()
> + {
> + if(confirm("Are you sure?")){
> + $.post('<%= url_for :controller => "quota", :action => "destroy", :id => @pool.quota %>',
> + function(data,status){
> + refresh_summary('hwpool_selection',
> + '<%= url_for :controller => "hardware",
> + :action => "quick_summary" %>',
> + <%= @pool.id %>)
> + if (data.alert) {
> + alert(data.alert);
> + }
> + }, 'json');
> + }
> + }
> +</script>
> +
> +
> + <% resources = @pool.full_resources %>
> + <div class="selection_key">
> + <br/>
> + <% for item in resources[:labels] %>
> + <% total_limit = resources[:total][item[1]]
> + total_limit = "unlimited" if total_limit.nil? %>
> + <%= item[0]%>:<br/>
> + <% end %>
> + </div>
> + <div class="selection_value">
> + default allowed<br/>
> + <% for item in resources[:labels] %>
> + <% total_limit = resources[:total][item[1]]
> + total_limit = "unlimited" if total_limit.nil? %>
> + <%= total_limit %>
> + <%= item[2]%><br>
> + <% end %>
> + </div>
> diff --git a/wui/src/app/views/hardware/show.html.erb b/wui/src/app/views/hardware/show.html.erb
> index 81bb708..b52243b 100644
> --- a/wui/src/app/views/hardware/show.html.erb
> +++ b/wui/src/app/views/hardware/show.html.erb
> @@ -1,4 +1,5 @@
> <div class="panel_header"></div>
> + <div class="data_section">
>
> <br/> <b><%= @pool.name %></b><br/><br/>
>
> @@ -102,4 +103,18 @@
> </tr>
>
> </table>
> + </div>
> +</div>
> +<div class="selection_detail" id="hwpool_selection">
> + <div>Hardware pool quota details.</div>
> </div>
> +<%- content_for :scripts do -%>
> +<script type="text/javascript">
> + $(document).ready(function(){
> + refresh_summary('hwpool_selection',
> + '<%= url_for :controller => "hardware",
> + :action => "quick_summary" %>',
> + <%= @pool.id %>)
> + });
> +</script>
> +<%- end -%>
> diff --git a/wui/src/app/views/host/show.rhtml b/wui/src/app/views/host/show.rhtml
> index dbc9028..c50d511 100644
> --- a/wui/src/app/views/host/show.rhtml
> +++ b/wui/src/app/views/host/show.rhtml
> @@ -1,5 +1,7 @@
> - <div class="selection_left">
> - <div class="selection_title"><%=h @host.hostname %></div>
> +<%- content_for :title do -%>
> + <%=h @host.hostname %>
> +<%- end -%>
> +
> <div class="selection_key">
> UUID:<br/>
> CPUs:<br/>
> @@ -22,7 +24,7 @@
> disabled
> <% end -%>
> <br/>
> - </div>
> +
> <!-- FIXME: need styling
> <h3>Network Interfaces</h3>
> <% if !@host.nics.empty? %>
> @@ -33,7 +35,8 @@
> <% end %>
> -->
> </div>
> -<div class="selection_right">
> +
> +<%- content_for :right do -%>
> <div class="detail-pane-chart-header">
> <span>
> Load
> @@ -62,5 +65,5 @@
> :chartType => 'line',
> :yGridLines => 'lightgrey',
> :url => (url_for :controller => 'graph', :action => 'graph', :type => 'detail') } %>
> -</div>
> +<%- end -%>
>
> diff --git a/wui/src/app/views/layouts/redux.rhtml b/wui/src/app/views/layouts/redux.rhtml
> index 63a9a56..a40cb1f 100644
> --- a/wui/src/app/views/layouts/redux.rhtml
> +++ b/wui/src/app/views/layouts/redux.rhtml
> @@ -43,10 +43,7 @@
> })
> });
> $(document).ready(function(){
> - $('a[rel*=facebox]').facebox()
> - })
> - $(document).ready(function(){
> - $('a[rel*=close]').trigger('close.facebox')
> + refresh_facebox()
> })
> </script>
> <%= yield :scripts -%>
> diff --git a/wui/src/app/views/layouts/selection.rhtml b/wui/src/app/views/layouts/selection.rhtml
> index 736517c..ff9583b 100644
> --- a/wui/src/app/views/layouts/selection.rhtml
> +++ b/wui/src/app/views/layouts/selection.rhtml
> @@ -1,2 +1,26 @@
> -<%# currently nothing for popups here. %>
> -<%= yield %>
> +<div class="selection_left">
> + <div class="selection_title"><%= yield :title -%></div>
> +
> + <% tools = yield :action_links -%>
> + <% if tools %>
> + <ul class="selection_tools">
> + <li>
> + <%= image_tag "icon_separator.png", :style=>"vertical-align: middle;" %>
> + </li>
> + <%= tools -%>
> + </ul>
> + <% end %>
> + <div class="clear_row"/>
> +
> + <%= yield %>
> +
> +</div>
> +<% right = yield :right -%>
> +<% if right %>
> + <div class="selection_right">
> + <%= right -%>
> + </div>
> +<% end %>
> +<script type="text/javascript">
> + refresh_facebox()
> +</script>
> \ No newline at end of file
> diff --git a/wui/src/app/views/quota/_form.rhtml b/wui/src/app/views/quota/_form.rhtml
> index 88d9adc..ac55550 100644
> --- a/wui/src/app/views/quota/_form.rhtml
> +++ b/wui/src/app/views/quota/_form.rhtml
> @@ -1,7 +1,7 @@
> <%= error_messages_for 'quota' %>
>
> <!--[form:quota]-->
> -<%= hidden_field_with_label (@quota.pool[:type] == "HardwarePool" ? "Hardware Pool" : "VM Resource Pool"), 'quota', 'pool_id', @quota.pool.name %>
> +<%= hidden_field 'quota', 'pool_id' %>
>
> <%= text_field_with_label "Total Virtual CPUs", 'quota', 'total_vcpus' %>
>
> diff --git a/wui/src/app/views/quota/edit.rhtml b/wui/src/app/views/quota/edit.rhtml
> index 30db6b7..d2f4be0 100644
> --- a/wui/src/app/views/quota/edit.rhtml
> +++ b/wui/src/app/views/quota/edit.rhtml
> @@ -1,35 +1,37 @@
> -<div id="dataTableWrapper">
> -
> - <div class="dataTable">
> - <div class="inside">
> -
> - <div class="data-table-column">
> - <% form_tag :action => 'update', :id => @quota do %>
> - <%= render :partial => 'form' %>
> - <%= submit_tag 'Edit' %>
> - <% end %>
> - </div>
> -
> - </div> <!-- end #data-table.inside -->
> - </div> <!-- end #dataTable -->
> -
> -</div> <!-- end #dataTableWrapper -->
> -
> -<div class="tools">
> - <h3>Actions</h3>
> -
> - <%if @can_modify -%>
> - <div class="actions remove">
> - <%= link_to 'Remove Quota (unlimited)', { :controller => 'quota', :action => 'destroy', :id => @quota }, { :confirm => 'Are you sure?', :method=> :post, :class => "edit" } %>
> - </div>
> - <%- end -%>
> -
> - <div class="actions">
> - <%= link_to "Back to #{@quota.pool.name}", { :controller => @quota.pool.get_controller, :action => 'show', :id => @quota.pool }, { :class => "show" } %>
> - </div>
> -
> -</div>
> -
> <%- content_for :title do -%>
> -<%= _("Editing Quota") %>
> + Edit Quota
> <%- end -%>
> +<%- content_for :description do -%>
> + Edit the quota for <%= @quota.pool.name %>.
> +<%- end -%>
> +
> +<form method="POST" action="<%= url_for :action => 'update' %>" id="quota_form" >
> +<div class="dialog_form">
> + <%= hidden_field_tag 'id', @quota.id %>
> + <%= render :partial => 'form' %>
> +</div>
> +<%= popup_footer("$('#quota_form').submit()", "Edit Quota") %>
> +</form>
> +
> +<script type="text/javascript">
> +$(function() {
> + var quotaoptions = {
> + target: '<%= url_for :action => 'update' %>', // target element to update
> + dataType: 'json',
> + success: function(response, status) {
> + ajax_validation(response, status)
> + if (response.success) {
> + jQuery(document).trigger('close.facebox');
> + refresh_summary('<%= (@quota.pool.get_controller == "hardware") ?
> + "hw" : "vm" %>pool_selection',
> + '<%= url_for :controller => @quota.pool.get_controller,
> + :action => "quick_summary" %>',
> + <%= @quota.pool.id %>)
> + }
> + }
> + };
> +
> + // bind form using 'ajaxForm'
> + $('#quota_form').ajaxForm(quotaoptions);
> +});
> +</script>
> diff --git a/wui/src/app/views/quota/new.rhtml b/wui/src/app/views/quota/new.rhtml
> index 7473884..861d74f 100644
> --- a/wui/src/app/views/quota/new.rhtml
> +++ b/wui/src/app/views/quota/new.rhtml
> @@ -1,39 +1,36 @@
> - <div id="data">
> - <div class="inside">
> -
> - <div id="dataTableWrapper">
> -
> - <div class="dataTable">
> - <div class="inside">
> -
> - <div class="data-table-column">
> -
> - <% form_tag :action => 'create' do %>
> - <%= render :partial => 'form' %>
> - <%= submit_tag "Create" %>
> - <% end %>
> - </div>
> -
> - </div> <!-- end #data-table.inside -->
> - </div> <!-- end #dataTable -->
> -
> - </div> <!-- end #dataTableWrapper -->
> -
> - </div> <!-- end #data.inside -->
> - </div> <!-- end #data -->
> -
> - </td>
> - <td id="right">
> - <div class="heading"> </div>
> - <div class="tools">
> - <h3>Actions</h3>
> - <div class="actions">
> - <%= link_to "Back to #{@quota.pool.name}", { :controller => @quota.pool.get_controller, :action => 'show', :id => @quota.pool }, { :class => "show" } %>
> - </div>
> - </div>
> -
> - </td>
> -
> <%- content_for :title do -%>
> -<%= _("New Quota") %>
> + Add New Quota
> +<%- end -%>
> +<%- content_for :description do -%>
> + Add a quota for <%= @quota.pool.name %>.
> <%- end -%>
> +
> +<form method="POST" action="<%= url_for :action => 'create' %>" id="quota_form" >
> +<div class="dialog_form">
> + <%= render :partial => 'form' %>
> +</div>
> +<%= popup_footer("$('#quota_form').submit()", "Create Quota") %>
> +</form>
> +
> +<script type="text/javascript">
> +$(function() {
> + var quotaoptions = {
> + target: '<%= url_for :action => 'create' %>', // target element to update
> + dataType: 'json',
> + success: function(response, status) {
> + ajax_validation(response, status)
> + if (response.success) {
> + jQuery(document).trigger('close.facebox');
> + refresh_summary('<%= (@quota.pool.get_controller == "hardware") ?
> + "hw" : "vm" %>pool_selection',
> + '<%= url_for :controller => @quota.pool.get_controller,
> + :action => "quick_summary" %>',
> + <%= @quota.pool.id %>)
> + }
> + }
> + };
> +
> + // bind form using 'ajaxForm'
> + $('#quota_form').ajaxForm(quotaoptions);
> +});
> +</script>
> diff --git a/wui/src/app/views/resources/quick_summary.rhtml b/wui/src/app/views/resources/quick_summary.rhtml
> index 3bdeefa..e71d9c9 100644
> --- a/wui/src/app/views/resources/quick_summary.rhtml
> +++ b/wui/src/app/views/resources/quick_summary.rhtml
> @@ -1,6 +1,7 @@
> - <div class="selection_left">
> - <div class="selection_title"><%=h @vm_resource_pool.name %> quota</div>
> -
> +<%- content_for :title do -%>
> + <%=h @vm_resource_pool.name %> quota
> +<%- end -%>
> +
> <% resources = @vm_resource_pool.full_resources %>
> <div class="selection_key">
> <br/>
> @@ -19,4 +20,3 @@
> <%= item[2]%><br>
> <% end %>
> </div>
> -</div>
> diff --git a/wui/src/app/views/resources/show.rhtml b/wui/src/app/views/resources/show.rhtml
> index ecf8fc6..64bd019 100644
> --- a/wui/src/app/views/resources/show.rhtml
> +++ b/wui/src/app/views/resources/show.rhtml
> @@ -40,7 +40,7 @@
> </td>
>
> <div class="selection_detail" id="vmpool_selection">
> - <div>Select a VM pool above.</div>
> + <div>VM pool quota details.</div>
> </div>
>
> <%- content_for :title do -%>
> @@ -50,9 +50,10 @@
> <%- content_for :scripts do -%>
> <script type="text/javascript">
> $(document).ready(function(){
> - $('#vmpool_selection').load('<%= url_for :controller => "resources",
> - :action => "quick_summary" %>',
> - { id: <%= @vm_resource_pool.id %>})
> + refresh_summary('vmpool_selection',
> + '<%= url_for :controller => "resources",
> + :action => "quick_summary" %>',
> + <%= @vm_resource_pool.id %>)
> });
> </script>
>
> diff --git a/wui/src/public/images/icon_edit.png b/wui/src/public/images/icon_edit.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..aaf2459f2e31ee73a7fff3e324d2825e4fca1e65
> GIT binary patch
> literal 375
> zcmeAS at N?(olHy`uVBq!ia0vp^0zk~e!3HF=pW8M9DVAa<&kznEsNqQI0P;BtJR*x3
> z7`Q%wFr(8NlNmrk(Gu5)66d1S#FEVXJcW?V+*AfreIrYK0}CgYnWjJmG9U%P`DrEP
> ziAAXljw$&`sS0kHMXBZaMcKs)&cVhruDLM-)m`v(aSYLzICYY3-XRA8H~D>xw%a|D
> zgO at M)ThkJw;OaGpc})@jHk0%lYl~U}mM&c6;r at B4LxjXn_AsfnCf4sW)3$J@^(_&*
> z!7$(O*s-$rduKHMEwsulJMjA92G&`>X9YH at Oiw*|x`^|@?T;Nx-a0pF$ApTSI-IMS
> zfBuNX_h8xb5BL3(mrqr-Y)SBB<4M>pzPNy^WRkXxrbJWl0``6`xmI at 8Nm14}{roh2
> z4mme9omN+Te&*@F)W3WOlFA-COe|iuZvU<$#s$}}`fk~Lv|RZQ^UZCi<#~2Lx&rhY
> NgQu&X%Q~loCII`8jh_Gj
>
> literal 0
> HcmV?d00001
>
> diff --git a/wui/src/public/images/icon_separator.png b/wui/src/public/images/icon_separator.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..225fd6e2ab616d20cfd99837a53cce1049185155
> GIT binary patch
> literal 216
> zcmeAS at N?(olHy`uVBq!ia0vp^LO{&J!3HGrh2HJ~QY^(zo*^7SP{WbZ0pxQQctjR6
> zFmQbUVMeDlCNqG7q9v{oCC){ui6xo&c?uz!xv31M`bL)e1{O{(GfjaCWIzgn^V3So
> z6N^$A98>a>QWe}Xi&D$;i?WLqoP&*LTytXvsx$O-aSYLznEd1ae|u&g<>r~j>HplP
> zDYwj&Si$1PD`lDyAbF%?j;VyCWT48$&AfID41TFbn`OhyB!QY4JYD@<);T3K0RRug
> BI;H>s
>
> literal 0
> HcmV?d00001
>
> diff --git a/wui/src/public/images/icon_x.png b/wui/src/public/images/icon_x.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..7190b38303f8657e9840311376f88899f1253a68
> GIT binary patch
> literal 340
> zcmeAS at N?(olHy`uVBq!ia0vp at K+MU(1|(lrEz1H at EX7WqAsj$Z!;#Vfk}U9uEM{Qf
> z`T)X=PHRkN00l)$Tq8=Hi&7IyGV}8kLNaqx8BFz!EcFd6oLpv_0u{)B6a?p|m6RtI
> zr7}3C<R_&nxMdclmgg5`7b`di8_&4r#tc-q*3-o?L}F_0L`D8X1_G_|l0w}_b$2MP
> zb8J>#p&Ie#-vu49ZdDGUWuDp3HblIcbn0-y((K=p)N0HBzEcf<pstj}B6R-D$(g5`
> z-9wYPH*5`Sm1}TPadoMQeOHtCf0yF7V>1L-sJz^C;|OzMMLFjKMaJ`=x8}>(`$uGp
> z8XrGn|I%djq%`9%H<xe<7Di7gICs#pJ?+Kcy}Di*YcFef?pmKU&9vQa`zJvOex^_V
> azpyTpsQIrKP$&#^ID at CFpUXO@geCykaeLGN
>
> literal 0
> HcmV?d00001
>
> diff --git a/wui/src/public/javascripts/ovirt.js b/wui/src/public/javascripts/ovirt.js
> index 675f20d..00befa1 100644
> --- a/wui/src/public/javascripts/ovirt.js
> +++ b/wui/src/public/javascripts/ovirt.js
> @@ -136,3 +136,15 @@ function afterVm(response, status){
> $("#vms_grid").flexReload()
> }
> }
> +
> +//selection detail refresh
> +function refresh_summary(element_id, url, obj_id){
> + $('#'+element_id+'').load(url, { id: obj_id})
> +}
> +
> +// this must be called again after ajax loading of content with facebox links
> +function refresh_facebox(){
> + $('a[rel*=facebox]').facebox()
> + $('a[rel*=close]').trigger('close.facebox')
> +}
> +
> diff --git a/wui/src/public/stylesheets/layout.css b/wui/src/public/stylesheets/layout.css
> index 3bbf1a1..74dd3c0 100644
> --- a/wui/src/public/stylesheets/layout.css
> +++ b/wui/src/public/stylesheets/layout.css
> @@ -233,8 +233,39 @@ textarea:focus, input:focus {
> font-size: 120%;
> font-weight:bold;
> padding-bottom: 10px;
> + float: left;
> }
>
> +.selection_tools {
> + background:transparent none repeat scroll 0%;
> + color:#000000;
> + float:left;
> + line-height:1.7;
> + list-style-type:none;
> + margin:0pt;
> + padding:0pt 8px;
> + text-align:center;
> + text-decoration:none;
> +}
> +.selection_tools li {
> + float:left;
> + margin:0pt 1px;
> + padding:0pt;
> +}
> +.selection_tools img {
> +}
> +.selection_tools a {
> + background:transparent none repeat scroll 0%;
> + color:#000000;
> + float:left;
> + line-height:1.7;
> + padding:0pt 8px;
> + text-align:center;
> + text-decoration:none;
> +}
> +.selection_tools a:hover {
> + background:#B0CBDE none repeat scroll 0%;
> +}
> .selection_key {
> text-align:right;
> float:left;
> --
> 1.5.4.1
Starting to get somewhere here... looks good.
ACK
and committed to the main repo.
--H
More information about the ovirt-devel
mailing list