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