class Canis::DefaultTableRowSorter
structures }}} sorter {{{ This is our default table row sorter. It does a multiple sort and allows for reverse sort also. It's a pretty simple sorter and uses sort, not sort_by. Improvements welcome. Usage: provide model in constructor or using model method Call toggle_sort_order
(column_index) Call sort. Currently, this sorts the provided model in-place. Future versions may maintain a copy, or use a table that provides a mapping of model to result. # TODO check if column_sortable
Attributes
Public Class Methods
model is array of data
# File lib/canis/core/widgets/table.rb, line 94 def initialize data_model=nil self.model = data_model @columns_sort = [] @sort_keys = nil end
Public Instance Methods
# File lib/canis/core/widgets/table.rb, line 99 def model=(model) @model = model @sort_keys = nil end
# File lib/canis/core/widgets/table.rb, line 187 def set_sort_keys list @sort_keys = list end
sorts the model based on sort keys and reverse flags @sort_keys contains indices to sort on @reverse_flags is an array of booleans, true for reverse, nil or false for ascending
# File lib/canis/core/widgets/table.rb, line 117 def sort return unless @model return if @sort_keys.empty? $log.debug "TABULAR SORT KEYS #{sort_keys} " # first row is the header which should remain in place # We could have kept column headers separate, but then too much of mucking around # with textpad, this way we avoid touching it header = @model.delete_at 0 begin # next line often can give error "array within array" - i think on date fields that # contain nils @model.sort!{|x,y| res = 0 @sort_keys.each { |ee| e = ee.abs-1 # since we had offsetted by 1 earlier abse = e.abs if ee < 0 xx = x[abse] yy = y[abse] # the following checks are since nil values cause an error to be raised if xx.nil? && yy.nil? res = 0 elsif xx.nil? res = 1 elsif yy.nil? res = -1 else res = y[abse] <=> x[abse] end else xx = x[e] yy = y[e] # the following checks are since nil values cause an error to be raised # whereas we want a nil to be wither treated as a zero or a blank if xx.nil? && yy.nil? res = 0 elsif xx.nil? res = -1 elsif yy.nil? res = 1 else res = x[e] <=> y[e] end end break if res != 0 } res } ensure @model.insert 0, header if header end end
# File lib/canis/core/widgets/table.rb, line 103 def sortable colindex, tf @columns_sort[colindex] = tf end
# File lib/canis/core/widgets/table.rb, line 106 def sortable? colindex return false if @columns_sort[colindex]==false return true end
toggle the sort order if given column offset is primary sort key Otherwise, insert as primary sort key, ascending.
# File lib/canis/core/widgets/table.rb, line 171 def toggle_sort_order index index += 1 # increase by 1, since 0 won't multiple by -1 # internally, reverse sort is maintained by multiplying number by -1 @sort_keys ||= [] if @sort_keys.first && index == @sort_keys.first.abs @sort_keys[0] *= -1 else @sort_keys.delete index # in case its already there @sort_keys.delete(index*-1) # in case its already there @sort_keys.unshift index # don't let it go on increasing if @sort_keys.size > 3 @sort_keys.pop end end end
should to_s be used for this column
# File lib/canis/core/widgets/table.rb, line 111 def use_to_s colindex return true # TODO end