On 05/23/2011 01:40 PM, jzigmund(a)redhat.com wrote:
From: Jozef Zigmund<jzigmund(a)redhat.com>
Added basic filtred view for pools, deployments and instances on
monitor page
---
src/app/controllers/pools_controller.rb | 27 +++++++++++++---
src/app/helpers/application_helper.rb | 11 ++++++
src/app/helpers/instances_helper.rb | 10 ------
src/app/models/deployment.rb | 11 ++++++
src/app/models/instance.rb | 10 ++++++
src/app/models/pool.rb | 10 ++++++
src/app/views/deployments/_list.haml | 52
+++++++++++++++++++-----------
src/app/views/layouts/_tabpanel.haml | 11 +++---
src/app/views/pools/_list.haml | 49
++++++++++++++++++++++-------
src/app/views/pools/_overview.haml | 4 +-
src/app/views/pools/index.haml | 28 ++++++++++++++++-
src/features/pool.feature | 19 +++++++++++
12 files changed, 187 insertions(+), 55 deletions(-)
diff --git a/src/app/controllers/pools_controller.rb
b/src/app/controllers/pools_controller.rb
index 33de831..aee9a08 100644
--- a/src/app/controllers/pools_controller.rb
+++ b/src/app/controllers/pools_controller.rb
@@ -16,14 +16,31 @@ class PoolsController< ApplicationController
def index
save_breadcrumb(pools_path(:viewstate => @viewstate ?
@viewstate.id : nil))
- @search_term = params[:q]
- if @search_term.blank?
- load_pools
+ @user_pools = Pool.list_for_user(current_user, Privilege::VIEW)
+ if filter_view?
+ @tabs = [{:name => 'Pools', :view => 'list', :id =>
'pools'},
+ {:name => 'Deployments', :view =>
'deployments/list', :id => 'deployments'},
+ {:name => 'Instances', :view => 'instances/list',
:id => 'instances'},
+ ]
+ details_tab_name = params[:details_tab].blank? ? 'pools' :
params[:details_tab]
+ @details_tab = @tabs.find {|t| t[:id] == details_tab_name} ||
@tabs.first[:name].downcase
+ case @details_tab[:id]
+ when 'pools'
+ @pools = Pool.list_or_search(params[:q],
params[:order_field],params[:order_dir])
+ when 'instances'
+ @instances = Instance.list_or_search(params[:q],
params[:order_field],params[:order_dir])
+ when 'deployments'
+ @deployments = Deployment.list_or_search(params[:q],
params[:order_field],params[:order_dir])
+ end
else
- @pools = Pool.search() { keywords(params[:q]) }.results
+ @pools = Pool.list_or_search(params[:q],
params[:order_field],params[:order_dir])
end
respond_to do |format|
- format.js { render :partial => 'list' }
+ format.js { if filter_view?
+ render :partial => params[:only_tab] == "true" ?
@details_tab[:view] : 'layouts/tabpanel'
+ else
+ render :partial => 'pretty_list'
+ end }
format.html
format.json { render :json => @pools }
end
diff --git a/src/app/helpers/application_helper.rb
b/src/app/helpers/application_helper.rb
index 3049c7b..a73f293 100644
--- a/src/app/helpers/application_helper.rb
+++ b/src/app/helpers/application_helper.rb
@@ -210,4 +210,15 @@ module ApplicationHelper
result_string<<"#{"%02d"%hours.to_i}:#{"%02d"%minutes.to_i}:#{"%02d"%seconds.to_i}"
result_string.join(", ")
end
+
+ def owner_name(obj)
+ return '' unless obj.owner
+ # if last_name is set, use full name,
+ # else use login
+ if obj.owner.last_name.blank?
+ obj.owner.login
+ else
+ "#{obj.owner.first_name} #{obj.owner.last_name}"
+ end
+ end
end
diff --git a/src/app/helpers/instances_helper.rb
b/src/app/helpers/instances_helper.rb
index 740b01f..b06286a 100644
--- a/src/app/helpers/instances_helper.rb
+++ b/src/app/helpers/instances_helper.rb
@@ -20,14 +20,4 @@
# Likewise, all the methods added will be available for all
controllers.
module InstancesHelper
- def owner_name(inst)
- return '' unless inst.owner
- # if last_name is set, use full name,
- # else use login
- if inst.owner.last_name.blank?
- inst.owner.login
- else
- "#{inst.owner.first_name} #{inst.owner.last_name}"
- end
- end
end
diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb
index 11e2b97..a9615ea 100644
--- a/src/app/models/deployment.rb
+++ b/src/app/models/deployment.rb
@@ -141,4 +141,15 @@ class Deployment< ActiveRecord::Base
end
errors
end
+
+ def self.list_or_search(query,order_field,order_dir)
+ if query.blank?
+ deployments = Deployment.all(:include => :owner,
+ :order => (order_field || 'name')
+' '+ (order_dir || 'asc'))
+ else
+ deployments = search() { keywords(query) }.results
+ end
+ deployments
+ end
+
end
diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb
index 4d1c5c6..c4820fa 100644
--- a/src/app/models/instance.rb
+++ b/src/app/models/instance.rb
@@ -292,6 +292,16 @@ class Instance< ActiveRecord::Base
(state == STATE_CREATE_FAILED) or (state == STATE_STOPPED and
not restartable?)
end
+ def self.list_or_search(query,order_field,order_dir)
+ if query.blank?
+ instances = Instance.all(:include => [ :template, :owner ],
+ :order => (order_field || 'name') +'
'+ (order_dir || 'asc'))
+ else
+ instances = search() { keywords(query) }.results
+ end
+ instances
+ end
+
named_scope :with_hardware_profile, lambda {
{:include => :hardware_profile}
}
diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb
index 866ecce..081c171 100644
--- a/src/app/models/pool.rb
+++ b/src/app/models/pool.rb
@@ -91,4 +91,14 @@ class Pool< ActiveRecord::Base
#end
end
+ def self.list_or_search(query,order_field,order_dir)
+ if query.blank?
+ pools = Pool.all(:include => [ :quota, :pool_family ],
+ :order => (order_field || 'name') +' '+
(order_dir || 'asc'))
+ else
+ pools = search() { keywords(query) }.results
+ end
+ pools
+ end
+
end
diff --git a/src/app/views/deployments/_list.haml
b/src/app/views/deployments/_list.haml
index 3f8064e..9d3e5d0 100644
--- a/src/app/views/deployments/_list.haml
+++ b/src/app/views/deployments/_list.haml
@@ -1,38 +1,52 @@
-= if request.xhr?
+- if request.xhr?
= render :partial => '/layouts/notification'
- form_tag do
- #object-actions
- = restful_submit_tag "Start", "start", deployments_path,
"PUT"
- = restful_submit_tag "Stop", "stop",
multi_stop_deployments_path,
"GET"
- = restful_submit_tag "Launch new", "launch_new",
launch_new_deployments_path, "GET"
- = restful_submit_tag "Delete", "delete", deployments_path,
"DELETE"
+ = link_to "New Deployment", new_deployment_path, { :class =>
'button' }
+ = label_tag "More actions"
+ = select_tag("more_actions",nil, :disabled => true)
- #search-actions
- = restful_submit_tag "Save Search", "save_search",
deployments_path, "PUT"
- = restful_submit_tag "Save Selection", "save_selection",
deployments_path, "PUT"
- = restful_submit_tag "Export to File", "export",
deployments_path, "PUT"
%p
- Select:
- = link_to "All", @url_params.merge(:select => 'all')
- %span> ,
- = link_to "None", @url_params.merge(:select => 'none')
+ Viewing
+ = select_tag("deployments_running", "<option>Deployments
running</option>",:disabled => true)
+ = @deployments.count.to_s + " results"
+ = text_field_tag :q, @search_term || "Search result for...",
:disabled => true
%table#deployments_table
- = sortable_table_header @header
+ %tr
+ %th
+ = check_box_tag "all"
+ %th
+ -#there will be icons (belongs to mockups)
+ %th
+ Deployment name
+ %th
+ Deployed on
+ %th
+ Instances
+ %th
+ Pool
+ %th
+ Pool Family
+ %th
+ Owner
Avoid using plain strings instead use I18n translations with
t-method
- @deployments.each do |deployment|
%tr
%td
- selected = @url_params[:select] == 'all'
%input{:name => "deployments_selected[]", :type =>
"checkbox", :value => deployment.id, :id =>
"deployment_checkbox_#{deployment.id}", :checked => selected }
%td
- = link_to deployment.name, deployment_path(deployment)
- %td
- = link_to deployment.deployable.name,
deployable_path(deployment.deployable)
+ -#there will be icons (belongs to mockups)
%td
- = deployment.owner.login
+ = link_to deployment.name, deployment_path(deployment)
%td
= deployment.created_at
%td
+ = deployment.instances.count
+ %td
= link_to deployment.pool.name, pool_path(deployment.pool)
+ %td
+ = deployment.pool.pool_family.name
+ %td
+ = deployment.owner
diff --git a/src/app/views/layouts/_tabpanel.haml
b/src/app/views/layouts/_tabpanel.haml
index c71cbac..2ccd801 100644
--- a/src/app/views/layouts/_tabpanel.haml
+++ b/src/app/views/layouts/_tabpanel.haml
@@ -1,9 +1,8 @@
#details-view.ui-tabs.ui-widget.ui-widget-content.ui-corner-all
%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))), :id => "details_#{tab}"}
- %span
- = tab
+ - @tabs.each do |tab|
+ %li.ui-state-default.ui-corner-top{ :class =>
"#{'ui-tabs-selected ui-state-active' if @details_tab[:id] ==
tab[:id]}"}
+ %a{ :href => url_for(:details_tab => tab[:id], :view =>
"filter", :only_tab => true), :id => "details_#{tab[:id]}" }
+ = tab[:name]
#details-selected
- = render :partial => @details_tab
+ = render :partial => @details_tab[:view]
diff --git a/src/app/views/pools/_list.haml
b/src/app/views/pools/_list.haml
index ff02c26..031aa94 100644
--- a/src/app/views/pools/_list.haml
+++ b/src/app/views/pools/_list.haml
@@ -1,28 +1,53 @@
- form_tag do
= link_to "New Pool", new_pool_path, { :class => 'button' }
- = restful_submit_tag "Destroy", 'destroy',
multi_destroy_pools_path, 'DELETE', :id => 'delete_button'
+ = label_tag "More actions"
+ = select_tag("more_actions",nil, :disabled => true)
%p
- Select:
- = link_to "All", @url_params.merge(:select => 'all')
- %span> ,
- = link_to "None", @url_params.merge(:select => 'none')
+ Viewing
+ = select_tag("select_pools", "<option>All
pools</option>",:disabled => true)
+ = @pools.count.to_s + " results"
+ = text_field_tag :q, @search_term || "Search result for...",
:disabled => true
%table#pools_table
- = sortable_table_header @header
+ %tr
+ %th
+ = check_box_tag "all"
+ %th
+ -#there will be icons (belongs to mockups)
+ %th
+ Pool name
+ %th
+ Deployments
+ %th
+ Instances
+ %th
+ Pending
+ %th
+ Failed
+ %th
+ Quota used
+ %th
Same as above
+ Pool Family
- @pools.each do |pool|
%tr
%td
- - selected = @url_params[:select] == 'all'
- %input{:name => "pools_selected[]", :type =>
"checkbox",
:value => pool.id, :id => "pool_checkbox_#{pool.id}", :checked =>
selected }
- = link_to pool.name, pool_path(pool)
+ %input{:name => "pools_selected[]", :type =>
"checkbox",
:value => pool.id, :id => "pool_checkbox_#{pool.id}" }
%td
- = pool.quota.maximum_running_instances or 'unlimited'
+ -#there will be icons (belongs to mockups)
+ %td
+ = pool.name
+ %td
+ = pool.deployments.count
+ %td
+ = 0 #pool.deployments.instances.count
+ %td
+ = 0 #there will be count of pending instances/deployments
+ %td
+ = 0 #there will be count of failed instances/deployments
You can get
this data from @statistics hash which is implemented in my
patch TASK-1553
%td
= pool.quota.percentage_used
='%'
%td
= pool.pool_family.name
- %td
- = pool.enabled
:javascript
$(document).ready(function () {
diff --git a/src/app/views/pools/_overview.haml
b/src/app/views/pools/_overview.haml
index 4bd54f4..50c5b25 100644
--- a/src/app/views/pools/_overview.haml
+++ b/src/app/views/pools/_overview.haml
@@ -7,7 +7,7 @@
%li.stat
%h3=t("stats_bar_pools")
%span.your_pools
- =(a)pools.count
+ =(a)user_pools.count
%span.in_use
4
%li.stat
@@ -28,4 +28,4 @@
(TODO)15
%li.stat
%h3=t("stats_bar_quota_used")
- (TODO) 86%
\ No newline at end of file
+ (TODO) 86%
diff --git a/src/app/views/pools/index.haml
b/src/app/views/pools/index.haml
index 7784a31..ff007ed 100644
--- a/src/app/views/pools/index.haml
+++ b/src/app/views/pools/index.haml
@@ -1,2 +1,28 @@
= render :partial => 'overview'
-= render :partial => 'pretty_list'
+= link_to "Pretty View", pools_path(:view => 'pretty'), :id
=>'pretty_view'
+= link_to "Filtred View", pools_path(:view => 'filter'), :id =>
'filtred_view'
+%div#view
+ - if params[:view] == 'filter'
+ = render :partial => 'layouts/tabpanel'
+ - else
+ = render :partial => 'pretty_list'
+
+:javascript
+ $(document).ready(function (){
+ $("#pretty_view").click(function(){
+ $.get($(this).attr("href"), $(this).serialize(),
+ function(result) {
+ $("#view").html(result);
+ }, "script");
+ return false;
+ });
+ $("#filtred_view").click(function(){
+ $.get($(this).attr("href"), $(this).serialize(),
+ function(result) {
+ $("#view").html(result);
+ $('#details-selected').hide();
+ $('#details-view').tabs('destroy').tabs();
+ }, "script");
+ return false;
+ });
+ });
diff --git a/src/features/pool.feature b/src/features/pool.feature
index 657e6b7..6c88c69 100644
--- a/src/features/pool.feature
+++ b/src/features/pool.feature
@@ -153,3 +153,22 @@ Feature: Manage Pools
And I accept JSON
When I delete "mockpool" pool
Then I should get back JSON object with success and errors
+
+ Scenario: Switch pretty view to filtred
+ Given I am on the pools page
+ And I see "Overview"
+ And I should see "expand all"
+ When I follow "Filtred View"
+ Then I should see "Pools" within "#details-view"
+ And I should see "Instances" within "#details-view"
+ And I should see "Deployments" within "#details-view"
+ And I should not see "expand all"
+ When I follow "Pretty View"
+
+ Scenario: Switch from filtred view to pretty
+ Given I am on the pools page
+ And I follow "Filtred View"
+ And I should see "Pools" within "#view"
+ When I follow "Pretty View"
+ Then I should not see "Pools" within "#view"
+ And I should see "expand all"
Ack.