---
 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

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

Reply via email to