---
src/app/controllers/pool_controller.rb | 27 +++++++++++++++------------
src/app/models/image.rb | 14 ++++++++++++++
src/app/models/instance.rb | 17 +++++++++++++++--
src/app/views/pool/show.html.erb | 5 +++++
4 files changed, 49 insertions(+), 14 deletions(-)
diff --git a/src/app/controllers/pool_controller.rb
b/src/app/controllers/pool_controller.rb
index c438773..dbd4c1b 100644
--- a/src/app/controllers/pool_controller.rb
+++ b/src/app/controllers/pool_controller.rb
@@ -101,20 +101,15 @@ class PoolController < ApplicationController
end
# FIXME: check sortable on selected column
- order_col = (cols[params[:iSortCol_0].to_i] || cols[default_order_col])[:id]
- order = order_col + " " + (params[:sSortDir_0] == 'desc' ?
'desc' : 'asc')
+ order_col_rec = cols[params[:iSortCol_0].to_i]
+ order_col = cols[default_order_col] unless order_col_rec &&
order_col_rec[:opts][:searchable]
+ order = order_col[:id] + " " + (params[:sSortDir_0] == 'desc' ?
'desc' : 'asc')
- if params[:sSearch].to_s.empty?
- conditions = {:pool_id => params[:id]}
- else
- conditions = ["pool_id = ? and name like ?", params[:id],
"%#{params[:sSearch]}%"]
- end
-
- @images = Image.paginate(
+ @images = Image.search_filter(params[:sSearch]).paginate(
:page => page + 1,
:include => :instances,
:order => order,
- :conditions => conditions
+ :conditions => {:pool_id => params[:id]}
)
expand_button_html = "<img src='/images/dir_closed.png'>"
@@ -140,9 +135,17 @@ class PoolController < ApplicationController
# iDisplayStart - start index
# iDisplayLength - num of recs
# => we need to count page num
- page = params[:iDisplayStart].to_i / 15
+ page = params[:iDisplayStart].to_i / Instance::RECS_PER_PAGE
+
+ order_col_rec = Instance::COLUMNS[params[:iSortCol_0].to_i]
+ order_col = Instance::COLUMNS[2] unless order_col_rec &&
order_col_rec[:opts][:searchable]
+ order = order_col[:id] + " " + (params[:sSortDir_0] == 'desc' ?
'desc' : 'asc')
- @instances = Instance.paginate(:page => page + 1, :order => "name
asc", :conditions => {:pool_id => params[:id]})
+ @instances = Instance.search_filter(params[:sSearch]).paginate(
+ :page => page + 1,
+ :order => order,
+ :conditions => {:pool_id => params[:id]}
+ )
# FIXME: default stylesheet redefines link color
details_html = "<a href='#'
class='details_link'>Details</a>"
diff --git a/src/app/models/image.rb b/src/app/models/image.rb
index 7b36c96..6591823 100644
--- a/src/app/models/image.rb
+++ b/src/app/models/image.rb
@@ -66,6 +66,20 @@ class Image < ActiveRecord::Base
{:id => 'instances', :header => 'Instances', :opts =>
{:sortable => false, :width => "20%"}},
]
+ SEARCHABLE_COLUMNS = %w(name architecture)
+
+ # FIXME: duplicit code with definition in app/models/image.rb
+ # what's the best strategy? inherit from same class, include module,...?
+ named_scope :search_filter, lambda {|str|
+ if str.to_s.empty?
+ {:conditions => {}}
+ else
+ $stderr.puts SEARCHABLE_COLUMNS.map {|c| "#{c} like ?"}.join(" OR
")
+ $stderr.puts Array.new(SEARCHABLE_COLUMNS.size, "%#{str}%").inspect
+ {:conditions => [SEARCHABLE_COLUMNS.map {|c| "#{c} like
?"}.join(" OR ")] + Array.new(SEARCHABLE_COLUMNS.size,
"%#{str}%")}
+ end
+ }
+
def provider_image?
!provider.nil?
diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb
index 8c2da69..9cb6c62 100644
--- a/src/app/models/instance.rb
+++ b/src/app/models/instance.rb
@@ -64,7 +64,7 @@ class Instance < ActiveRecord::Base
# used to get sorting column in controller and in view to generate datatable definition
and
# html table structure
COLUMNS = [
- {:id => 'id', :header => '', :opts => {:checkbox_id =>
'image_id', :searchable => false, :sortable => false, :width =>
'1px', :class => 'center'}},
+ {:id => 'id', :header => '<input type="checkbox"
id="image_id_all" onclick="checkAll(event)">', :opts =>
{:checkbox_id => 'image_id', :searchable => false, :sortable => false,
:width => '1px', :class => 'center'}},
{:id => 'actions', :header => 'Actions', :opts => {:width
=> "15%", :sortable => false}},
{:id => 'name', :header => 'Name', :opts => {:width =>
"25%"}},
{:id => 'details', :header => '', :opts => {:width =>
"10%", :sortable => false, :searchable => false}},
@@ -73,7 +73,20 @@ class Instance < ActiveRecord::Base
{:id => 'image', :header => 'Image', :opts => {:sortable
=> false}},
]
- RECS_PER_PAGE = 15
+ SEARCHABLE_COLUMNS = %w(name state)
+
+ # FIXME: duplicit code with definition in app/models/image.rb
+ # what's the best strategy? inherit from same class, include module,...?
+ named_scope :search_filter, lambda {|str|
+ if str.to_s.empty?
+ {:conditions => {}}
+ else
+ $stderr.puts SEARCHABLE_COLUMNS.map {|c| "#{c} like ?"}.join(" OR
")
+ $stderr.puts Array.new(SEARCHABLE_COLUMNS.size, "%#{str}%").inspect
+ {:conditions => [SEARCHABLE_COLUMNS.map {|c| "#{c} like
?"}.join(" OR ")] + Array.new(SEARCHABLE_COLUMNS.size,
"%#{str}%")}
+ end
+ }
+
def get_action_list(user=nil)
# return empty list rather than nil
diff --git a/src/app/views/pool/show.html.erb b/src/app/views/pool/show.html.erb
index 43fcec8..22df80b 100644
--- a/src/app/views/pool/show.html.erb
+++ b/src/app/views/pool/show.html.erb
@@ -40,6 +40,11 @@
if ($(ev.target).attr('name') != "image_id[]")
box.attr('checked', !box.attr('checked'));
}
+
+ function checkAll(ev) {
+ $('input[name="image_id[]"]',
dataTable_instances_table).attr('checked', $(ev.target).attr('checked'))
+ }
+
</script>
<%= link_to "Add a new instance", {:controller => "instance",
:action => "new", :id => @pool}, :class=>"actionlink"%>
--
1.6.2.5