Class: Caboose::PageBarGenerator

Inherits:
Object
  • Object
show all
Defined in:
app/models/caboose/page_bar_generator.rb

Direct Known Subclasses

Pager

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(post_get, params = nil, options = nil) ⇒ PageBarGenerator

Returns a new instance of PageBarGenerator.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/models/caboose/page_bar_generator.rb', line 16

def initialize(post_get, params = nil, options = nil)
  
  params  = {} if params.nil?
  options = {} if options.nil?
  
	# Note: a few keys are required:
	# base_url, page, itemCount, itemsPerPage
	@params = {}
	@options = {
	  'model'           => '',
		'sort' 			      => '',
		'desc' 			      => 0,
		'base_url'		    => '',
		'page'			      => 1,
		'item_count'		  => 0,
		'items_per_page'  => 10
	}      
	params.each   { |key, val| @params[key]  = val }
	options.each  { |key, val| @options[key] = val }
	@params.each  { |key, val| @params[key]  = post_get[key].nil? ? val : post_get[key] }			
	@options.each { |key, val| @options[key] = post_get[key].nil? ? val : post_get[key] }
	fix_desc
	@options['item_count'] = @options['model'].constantize.where(where).count  		  		
end

Instance Attribute Details

#optionsObject

Parameters: params: array of key/value pairs that must include the following: base_url: url without querystring onto which the parameters are added. itemCount: Total number of items.

In addition, the following parameters are not required but may be included in the array: itemsPerPage: Number of items you want to show per page. Defaults to 10 if not present. page: Current page number. Defaults to 0 if not present.



14
15
16
# File 'app/models/caboose/page_bar_generator.rb', line 14

def options
  @options
end

#paramsObject

Parameters: params: array of key/value pairs that must include the following: base_url: url without querystring onto which the parameters are added. itemCount: Total number of items.

In addition, the following parameters are not required but may be included in the array: itemsPerPage: Number of items you want to show per page. Defaults to 10 if not present. page: Current page number. Defaults to 0 if not present.



14
15
16
# File 'app/models/caboose/page_bar_generator.rb', line 14

def params
  @params
end

Instance Method Details

#fix_descObject



41
42
43
44
45
46
47
48
# File 'app/models/caboose/page_bar_generator.rb', line 41

def fix_desc
  @options['desc'] = 0 and return if @options['desc'].nil?
  return if @options['desc'] == 1
  return if @options['desc'] == 0
  @options['desc'] = 1 and return if @options['desc'] == 'true' || @options['desc'].is_a?(TrueClass)
  @options['desc'] = 0 and return if @options['desc'] == 'false' || @options['desc'].is_a?(FalseClass)  	  
  @options['desc'] = @options['desc'].to_i 
end

#generateObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'app/models/caboose/page_bar_generator.rb', line 72

def generate
    	  
	# Check for necessary parameter values
	return false if !ok(@options['base_url']) # Error: base_url is required for the page bar generator to work.
	return false if !ok(@options['item_count']) # Error: itemCount is required for the page bar generator to work.
	
	# Set default parameter values if not present
	@options['items_per_page'] = 10  if @options["items_per_page"].nil?
	@options['page']           = 1   if @options["page"].nil?		
	
	# Variables to make the search form work 
	vars = get_vars()
	page = @options["page"].to_i
			
	# Max links to show (must be odd) 
	total_links = 5
	prev_page = page - 1
	next_page = page + 1
	total_pages = (@options['item_count'].to_f / @options['items_per_page'].to_f).ceil
	
	if (total_pages < total_links)
		start = 1
		stop = total_pages			
	else
		start = page - (total_links/2).floor			
		start = 1 if start < 1
		stop = start + total_links - 1
		
		if (stop > total_pages)
			stop = total_pages				
			start = stop - total_links  				
			start = 1 if start < 1
		end
	end
	
	base_url = @params['base_url']
	str = ''
	str << "<p>Results: showing page #{page} of #{total_pages}</p>\n"
	
	if (total_pages > 1)
	  str << "<div class='page_links'>\n"
	  if (page > 1)
	    str << "<a href='#{base_url}?#{vars}&page=#{prev_page}'>Previous</a>"
    end
	  for i in start..stop
	  	if (page != i)
	  	  str << "<a href='#{base_url}?#{vars}&page=#{i}'>#{i}</a>"
	  	else
	  		str << "<span class='current_page'>#{i}</span>"
	  	end
	  end
	  if (page < total_pages)
	  	str << "<a href='#{base_url}?#{vars}&page=#{next_page}'>Next</a>"
	  end
	  str << "</div>\n"
   end
   
	return str
end

#get_varsObject



132
133
134
135
136
137
138
# File 'app/models/caboose/page_bar_generator.rb', line 132

def get_vars()  
  vars = []
  @params.each do |k,v|
    vars.push("#{k}=#{v}") if !v.nil? && v.length > 0 
  end
  return URI.escape(vars.join('&'))
end

#itemsObject



64
65
66
67
68
69
70
# File 'app/models/caboose/page_bar_generator.rb', line 64

def items
 	assoc = @options['model'].constantize.where(where)
 	if @options['items_per_page'] != -1
 	  assoc = assoc.limit(limit).offset(offset)
 	end
 	return assoc.reorder(reorder).all
end

#limitObject



195
196
197
# File 'app/models/caboose/page_bar_generator.rb', line 195

def limit
  return @options['items_per_page'].to_i
end

#offsetObject



199
200
201
# File 'app/models/caboose/page_bar_generator.rb', line 199

def offset
  return (@options['page'].to_i - 1) * @options['items_per_page'].to_i
end

#ok(val) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/models/caboose/page_bar_generator.rb', line 50

def ok(val)
   return false if val.nil?
   return true  if val.is_a? Array
   return true  if val.is_a? Hash
   return true  if val.is_a? Integer
   return true  if val.is_a? Fixnum
   return true  if val.is_a? Float
   return true  if val.is_a? Bignum
   return true  if val.is_a? TrueClass
   return true  if val.is_a? FalseClass
   return false if val == ""
   return true
end

#reorderObject



203
204
205
206
207
208
209
210
# File 'app/models/caboose/page_bar_generator.rb', line 203

def reorder
  str = "id"
  if (!@options['sort'].nil? && @options['sort'].length > 0)
    str = "#{@options['sort']}"
  end
  str << " desc" if @options['desc'] == 1       
  return str
end

#sortable_table_headings(cols) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
# File 'app/models/caboose/page_bar_generator.rb', line 140

def sortable_table_headings(cols)
  vars = get_vars()
	str = ''
  
	# key = sort field, value = text to display
	cols.each do |sort, text|    		
		arrow = @options['sort'] == sort ? (@options['desc'] == 1 ? ' &uarr;' : ' &darr;') : ''    		
		link = @options['base_url'] + "?#{vars}&sort=#{sort}&desc=" + (@options['desc'] == 1 ? "0" : "1")
		str += "<th><a href='#{link}'>#{text}#{arrow}</a></th>\n"
	end
	return str  	
end

#whereObject



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'app/models/caboose/page_bar_generator.rb', line 153

def where
  sql = []
  values = []      
 @params.each do |k,v|
    next if v.nil? || v.length == 0
    
    sql2 = ""
    if k.ends_with?('_gte')
      sql2 = "#{k[0..-5]} >= ?"
    elsif k.ends_with?('_gt')
      sql2 = "#{k[0..-4]} > ?"
    elsif k.ends_with?('_lte')
      sql2 = "#{k[0..-5]} <= ?"
    elsif k.ends_with?('_lt')
      sql2 = "#{k[0..-4]} < ?"
    elsif k.ends_with?('_bw')
      sql2 = "upper(#{k[0..-4]}) like ?"
      v = v.kind_of?(Array) ? v.collect{ |v2| "#{v2}%".upcase } : "#{v}%".upcase          
    elsif k.ends_with?('_ew')
      sql2 = "upper(#{k[0..-4]}) like ?"
      v = v.kind_of?(Array) ? v.collect{ |v2| "%#{v2}".upcase } : "%#{v}".upcase
    elsif k.ends_with?('_like')
      sql2 = "upper(#{k[0..-6]}) like ?"
      v = v.kind_of?(Array) ? v.collect{ |v2| "%#{v2}%".upcase } : "%#{v}%".upcase
    else          
      sql2 = "#{k} = ?"
    end
    
    if v.kind_of?(Array)
      sql2 = "(" + v.collect{ |v2| "#{sql2}" }.join(" or ") + ")"
      v.each { |v2| values << v2 }
    else              
      values << v
    end
    sql << sql2                          
 end
 sql_str = sql.join(' and ')
 sql = [sql_str]  	   	  
 values.each { |v| sql << v }        	  
 return sql        	  
end