Class: MagicGrid::HtmlGrid

Inherits:
Object
  • Object
show all
Defined in:
lib/magic_grid/html_grid.rb

Instance Method Summary collapse

Constructor Details

#initialize(grid_definition, view, controller = nil) ⇒ HtmlGrid

Returns a new instance of HtmlGrid.



6
7
8
9
10
11
12
13
14
# File 'lib/magic_grid/html_grid.rb', line 6

def initialize(grid_definition, view, controller = nil)
  @grid = grid_definition
  @view ||= view
  if controller
    @current_url = controller.request.fullpath
  else
    @current_url = nil
  end
end

Instance Method Details

#filler_block(content = nil, &block) ⇒ Object



88
89
90
91
92
93
94
95
# File 'lib/magic_grid/html_grid.rb', line 88

def filler_block(content = nil, &block)
  @view. 'tr' do
    @view.('td', content,
                      :class => 'full-width ui-widget-header',
                      :colspan => @grid.columns.count,
                      &block)
  end
end

#grid_cell(column, record) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/magic_grid/html_grid.rb', line 144

def grid_cell(column, record)
  @view.('td', :class => column.html_classes) do
    method = column.reader
    if method.respond_to? :call
      method.call(record).to_s
    elsif record.respond_to? method
      record.send(method).to_s
    else
      ""
    end
  end
end

#grid_row(record, &row_renderer) ⇒ Object



134
135
136
137
138
139
140
141
142
# File 'lib/magic_grid/html_grid.rb', line 134

def grid_row(record, &row_renderer)
  if row_renderer
    @view.capture(record, &row_renderer)
  else
    @view. 'tr', :class => @view.cycle('odd', 'even') do
      @grid.columns.map { |c| grid_cell(c, record) }.join.html_safe
    end
  end
end

#magic_column_headersObject



97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/magic_grid/html_grid.rb', line 97

def magic_column_headers
  @view. 'tr' do
    @grid.columns.reduce(''.html_safe) do |acc, col|
      classes = ['ui-state-default'] << col.html_classes
      acc <<
      if col.sortable?
        sortable_header(col)
      else
        @view. 'th', col.label.html_safe, :class => classes.join(' ')
      end
    end
  end
end

#magic_grid_footObject



80
81
82
83
84
85
86
# File 'lib/magic_grid/html_grid.rb', line 80

def magic_grid_foot
  if @grid.options[:per_page] and @grid.options[:bottom_pager]
    magic_pager_block
  elsif not @grid.options[:collapse_emtpy_footer]
    filler_block
  end
end

#magic_grid_headObject



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/magic_grid/html_grid.rb', line 64

def magic_grid_head
  spinner = self.method(:spinner_generator)
  thead = []
  if @grid.needs_searcher?
    thead << searcher_block(&spinner)
  end
  if @grid.options[:per_page] and @grid.options[:top_pager]
    thead << magic_pager_block(&spinner)
  end
  if thead.empty? and not @grid.options[:collapse_emtpy_header]
    thead << filler_block(&spinner)
  end
  thead << magic_column_headers
  thead.join.html_safe
end

#magic_pager(collection, opts = {}) ⇒ Object



242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/magic_grid/html_grid.rb', line 242

def magic_pager(collection, opts={})
  if @view.respond_to? :will_paginate
    # WillPaginate
    @view.will_paginate collection.collection, opts
  elsif @view.respond_to? :paginate
    #Kaminari, or something else..
    @view.paginate collection.collection, opts
  else
    ("<!-- page #{collection.current_page} of #{collection.total_pages} -->" +
     '<!-- INSTALL WillPaginate or Kaminari for a pager! -->').html_safe
  end
end

#magic_pager_block(&spinner) ⇒ Object



255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'lib/magic_grid/html_grid.rb', line 255

def magic_pager_block(&spinner)
  @view.('tr') do
    @view.('td', :class => 'full-width ui-widget-header magic-pager',
                :colspan => @grid.columns.count) do
      pager = magic_pager(@grid.magic_collection,
                            :param_name => @grid.param_key(:page),
                            :params => @grid.base_params
                           )
      if spinner
        pager << @view.capture(&spinner)
      end
      pager
    end
  end
end

#magic_rows(&row_renderer) ⇒ Object



111
112
113
114
115
116
117
# File 'lib/magic_grid/html_grid.rb', line 111

def magic_rows(&row_renderer)
  rows = @grid.collection.map { |row| grid_row(row, &row_renderer) }
  if rows.empty?
    rows << render_empty_collection(@grid.options[:if_empty])
  end
  rows.join.html_safe
end

#order_class(order = -1)) ⇒ Object



177
178
179
180
181
182
183
# File 'lib/magic_grid/html_grid.rb', line 177

def order_class(order = -1)
  case order.to_i
  when 0 then 'sort-asc'
  when 1 then 'sort-desc'
  else 'sort-none'
  end
end

#order_icon(order = -1)) ⇒ Object



165
166
167
# File 'lib/magic_grid/html_grid.rb', line 165

def order_icon(order = -1)
  @view. 'span', '', :class => "ui-icon #{order_icon_class(order)}"
end

#order_icon_class(order = -1)) ⇒ Object



169
170
171
172
173
174
175
# File 'lib/magic_grid/html_grid.rb', line 169

def order_icon_class(order = -1)
  case order.to_i
  when 0 then 'ui-icon-triangle-1-n'
  when 1 then 'ui-icon-triangle-1-s'
  else 'ui-icon-carat-2-n-s'
  end
end

#render(&row_renderer) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/magic_grid/html_grid.rb', line 16

def render(&row_renderer)
  @spinner_drawn = false
  grid_data = {
    :searcher => @grid.searcher,
    :current => @current_url,
    :live_search => @grid.options[:live_search],
    :listeners => @grid.options[:listeners],
    :remote => @grid.options[:remote],
    :default_ajax_handler => @grid.options[:default_ajax_handler],
    :params => @grid.base_params,
  }
  table_options = {
    :class => (['magic_grid'] << @grid.options[:class]).join(' '),
    :id => @grid.magic_id,
    :data => grid_data.select {|_,v| v }
  }
  @view.('table', table_options) do
    thead + tbody(&row_renderer) + tfoot
  end
end

#render_empty_collection(fallback) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/magic_grid/html_grid.rb', line 119

def render_empty_collection(fallback)
  if fallback
    @view. 'tr' do
      @view.('td', :colspan => @grid.columns.count,
                        :class => 'if-empty') do
        if fallback.respond_to? :call
          fallback.call(@grid).to_s
        else
          fallback
        end
      end
    end
  end
end

#reverse_order(order) ⇒ Object



161
162
163
# File 'lib/magic_grid/html_grid.rb', line 161

def reverse_order(order)
  order.to_i == 0 ? 1 : 0
end

#searcher_block(&spinner) ⇒ Object



212
213
214
215
216
217
218
219
# File 'lib/magic_grid/html_grid.rb', line 212

def searcher_block(&spinner)
  @view.('tr') do
    @view.('td', :class => 'searcher full-width ui-widget-header',
                :colspan => @grid.columns.count) do
      searcher_input(&spinner)
    end
  end
end

#searcher_input(&spinner) ⇒ Object



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/magic_grid/html_grid.rb', line 221

def searcher_input(&spinner)
  searcher_data = {
    :min_length => @grid.options[:min_search_length],
    :current => @grid.current_search || "",
  }
  searcher = @view.label_tag(@grid.searcher.to_sym,
                       @grid.options[:searcher_label])
  searcher << @view.search_field_tag(@grid.searcher.to_sym,
    @grid.param(:q),
    :placeholder => @grid.options[:searcher_tooltip],
    :size => @grid.options[:searcher_size],
    :data => searcher_data,
    :form => "a form that doesn't exist")
  if @grid.options[:search_button]
    searcher << @view.button_tag(@grid.options[:searcher_button],
      :class => 'magic-grid-search-button')
  end
  searcher << yield if block_given?
  searcher
end

#sortable_header(col) ⇒ Object



185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/magic_grid/html_grid.rb', line 185

def sortable_header(col)
  id = col.id
  label = col.label || id.titleize
  default_sort_order = @grid.order(@grid.default_order)
  my_params = @grid.base_params.merge({
    @grid.param_key(:col) => id,
  })
  column_link_params = HashWithIndifferentAccess.new(my_params)
  order = unordered
  classes = ['sorter ui-state-default'] << col.html_classes
  if id.to_s == @grid.current_sort_col.to_s
    order = @grid.current_order
    classes << "sort-current" << order_class(order)
    column_link_params[@grid.param_key(:order)] = reverse_order(order)
  else
    column_link_params.delete @grid.param_key(:order)
  end
  if column_link_params[@grid.param_key(:order)].to_i == default_sort_order.to_i
    column_link_params.delete(@grid.param_key(:order))
  end
  @view. 'th', :class => classes.join(' ') do
    @view.link_to column_link_params, :remote => @grid.options[:remote] do
      label.html_safe << order_icon(order)
    end
  end
end

#spinner_generatorObject



55
56
57
58
59
60
61
62
# File 'lib/magic_grid/html_grid.rb', line 55

def spinner_generator
  unless @spinner_drawn
    @spinner_drawn = true
    @view.tag('span',
              :id => (@grid.magic_id.to_s + "_spinner"),
              :class => "magic_grid_spinner")
  end
end

#tbody(&row_renderer) ⇒ Object



43
44
45
46
47
# File 'lib/magic_grid/html_grid.rb', line 43

def tbody(&row_renderer)
  @view.('tbody', :class => "ui-widget-content") do
    magic_rows &row_renderer
  end
end

#tfootObject



49
50
51
52
53
# File 'lib/magic_grid/html_grid.rb', line 49

def tfoot
  @view.('tfoot') do
    magic_grid_foot
  end
end

#theadObject



37
38
39
40
41
# File 'lib/magic_grid/html_grid.rb', line 37

def thead
  @view.('thead', :data => {:params => @grid.base_params}) do
    magic_grid_head
  end
end

#unorderedObject



157
158
159
# File 'lib/magic_grid/html_grid.rb', line 157

def unordered
  -1
end