module MightyGrid
module GridViewHelper
def grid(grid, opts={}, &block)
define_grid(grid, opts, &block)
render_grid(grid)
end
def define_grid(grid, options={}, &block)
rendering = GridRenderer.new(grid, self)
block.call(rendering)
table_html_attrs = options[:html] || {}
table_html_attrs = MightyGrid::MgHTML.join_html_classes(table_html_attrs, 'mighty-grid', MightyGrid.config.table_class)
grid.read
if grid.relation.total_count > 0
grid.output_buffer = content_tag :table, table_html_attrs do
html = header_grid_html(rendering, grid, options)
html += footer_grid_html(rendering, grid)
html += body_grid_html(rendering, grid)
html
end
else
grid.output_buffer = blank_slate_template(rendering)
end
end
# Used after define_grid to actually output the grid HTML code.
# Usually used with detached filters: first define_grid, then grid_filters, and then
# render_grid
def render_grid(grid)
grid.output_buffer.html_safe
end
# Creates a form to filter the data in the target grid.
def mighty_filter_for(grid, options={}, &block)
html_options = options[:html] ||= {}
html_options = MightyGrid::MgHTML.join_html_classes(html_options, 'mighty-grid-filter')
html_options[:method] = options.delete(:method) if options.has_key?(:method)
html_options[:method] ||= :get
filter = FilterRenderer.new(grid, self)
output = capture(filter, &block)
form_tag(options[:url] || {}, html_options){ output }
end
def header_grid_html(rendering, grid, options)
header_tr_html = options[:header_tr_html] || {}
header_tr_html = MightyGrid::MgHTML.join_html_classes(header_tr_html, MightyGrid.config.header_tr_class)
content_tag :thead do
content_tag :tr, header_tr_html do
rendering.columns.map { |column|
content_tag :th, column.th_attrs do
if column.options[:ordering] && column.attribute.present?
link_to(column.title, "?#{MightyGrid::MgHash.rec_merge(grid.params, grid.order_params(column.attribute)).except('controller', 'action').to_query}").html_safe
else
column.title.html_safe
end
end
}.join.html_safe
end
end
end
def body_grid_html(rendering, grid)
content_tag :tbody do
html_record = ''
grid.relation.each do |rel|
html_record += content_tag :tr do
rendering.columns.map{|column| content_tag :td, column.render(rel), column.attrs}.join.html_safe
end
end
html_record.html_safe
end
end
def footer_grid_html(rendering, grid)
content_tag :tfoot do
content_tag :tr do
content_tag :td, colspan: rendering.total_columns do
html_pag = paginate(grid.relation, theme: MightyGrid.config.pagination_theme, param_name: "#{grid.name}[page]")
html_pag += content_tag :strong do
"#{grid.relation.offset_value + 1} – #{grid.relation.offset_value + grid.relation.size} of #{grid.relation.total_count}".html_safe
end
html_pag.html_safe
end
end.html_safe
end
end
def blank_slate_template(rendering)
if rendering.blank_slate_handler.present?
case rendering.blank_slate_handler
when Proc; rendering.blank_slate_handler.call
when String; rendering.blank_slate_handler
when Hash; render(rendering.blank_slate_handler)
end
else
content_tag :div, 'No records found'
end
end
end
end