Skip to content

Commit

Permalink
Add facility to render datagrid partials from custom path:
Browse files Browse the repository at this point in the history
* :partials options is added to all helpers which may render partials
  • Loading branch information
ka8725 committed Mar 24, 2014
1 parent d4b44f2 commit 6ecd153
Show file tree
Hide file tree
Showing 9 changed files with 125 additions and 11 deletions.
2 changes: 1 addition & 1 deletion app/views/datagrid/_head.html.erb
Expand Up @@ -2,7 +2,7 @@
<% grid.html_columns(*options[:columns]).each do |column| %>
<th class="<%= datagrid_column_classes(grid, column) %>">
<%= column.header %>
<%= datagrid_order_for(grid, column) if column.order && options[:order]%>
<%= datagrid_order_for(grid, column, options) if column.order && options[:order]%>
</th>
<% end %>
</tr>
14 changes: 11 additions & 3 deletions lib/datagrid/helper.rb
Expand Up @@ -24,6 +24,8 @@ def datagrid_format_value(report, column_name, model)
# * <tt>:columns</tt> - Array of column names to display.
# Used in case when same grid class is used in different places
# and needs different columns. Default: all defined columns.
# * <tt>:partials</tt> - Path for partials lookup.
# Default: 'datagrid'.
def datagrid_table(report, *args)
datagrid_renderer.table(report, *args)
end
Expand All @@ -34,7 +36,8 @@ def datagrid_table(report, *args)
#
# * <tt>:order</tt> - display ordering controls built-in into header
# Default: true
#
# * <tt>:partials</tt> - Path for partials lookup.
# Default: 'datagrid'.
def datagrid_header(grid, options = {})
datagrid_renderer.header(grid, options)
end
Expand All @@ -46,8 +49,13 @@ def datagrid_rows(report, assets, options = {})
end

# Renders ordering controls for the given column name
def datagrid_order_for(grid, column)
datagrid_renderer.order_for(grid, column)
#
# Supported options:
#
# * <tt>:partials</tt> - Path for partials lookup.
# Default: 'datagrid'.
def datagrid_order_for(grid, column, options = {})
datagrid_renderer.order_for(grid, column, options)
end

# Renders HTML for for grid with all filters inputs and lables defined in it
Expand Down
33 changes: 27 additions & 6 deletions lib/datagrid/renderer.rb
Expand Up @@ -30,7 +30,7 @@ def form_for(grid, options = {})
options[:method] ||= :get
options[:html] ||= {}
options[:html][:class] ||= "datagrid-form #{@template.dom_class(grid)}"
@template.render :partial => "datagrid/form", :locals => {:grid => grid, :options => options}
_render_partial('form', options[:partials], {:grid => grid, :options => options})
end

def table(grid, *args)
Expand All @@ -47,29 +47,50 @@ def table(grid, *args)
assets = assets.paginate(paginate)
end

@template.render :partial => "datagrid/table", :locals => {:grid => grid, :options => options, :assets => assets}
_render_partial('table', options[:partials],
{
:grid => grid,
:options => options,
:assets => assets
})
end

def header(grid, options = {})
options[:order] = true unless options.has_key?(:order)

@template.render :partial => "datagrid/head", :locals => {:grid => grid, :options => options}
_render_partial('head', options[:partials],
{ :grid => grid, :options => options })
end

def rows(grid, assets, options = {})
result = assets.map do |asset|
@template.render :partial => "datagrid/row", :locals => {:grid => grid, :options => options, :asset => asset}
_render_partial('row', options[:partials],
{
:grid => grid,
:options => options,
:asset => asset
})
end.join

_safe(result)
end

def order_for(grid, column)
@template.render :partial => "datagrid/order_for", :locals => { :grid => grid, :column => column }
def order_for(grid, column, options = {})
_render_partial('order_for', options[:partials],
{ :grid => grid, :column => column })
end

private

def _safe(string)
string.respond_to?(:html_safe) ? string.html_safe : string
end

def _render_partial(partial_name, partials_path, locals = {})
@template.render({
:partial => File.join(partials_path || 'datagrid', partial_name),
:locals => locals
})
end
end
end
29 changes: 28 additions & 1 deletion spec/datagrid/helper_spec.rb
Expand Up @@ -128,6 +128,26 @@ class TestGrid
end
end

context 'with partials attribute' do
let(:grid) do
test_report do
scope { Entry }
column(:name)
column(:category)
end
end

it 'renders namespaced table partial' do
rendered_partial = subject.datagrid_table(grid, [entry], {
:partials => 'client/datagrid'
})
expect(rendered_partial).to include 'Namespaced table partial.'
expect(rendered_partial).to include 'Namespaced row partial.'
expect(rendered_partial).to include 'Namespaced head partial.'
expect(rendered_partial).to include 'Namespaced order_for partial.'
end
end


describe ".datagrid_rows" do
it "should support urls" do
Expand Down Expand Up @@ -308,7 +328,7 @@ class TestGrid
"td.name" => 1
)
end
end
end
end

describe ".datagrid_order_for" do
Expand All @@ -328,6 +348,13 @@ class OrderedGrid
end
end
describe ".datagrid_form_for" do
it 'returns namespaced partial if partials options is passed' do
rendered_form = subject.datagrid_form_for(grid, {
:url => '',
:partials => 'client/datagrid'
})
expect(rendered_form).to include 'Namespaced form partial.'
end
it "should render form and filter inputs" do
class FormForGrid
include Datagrid
Expand Down
13 changes: 13 additions & 0 deletions spec/support/test_partials/client/datagrid/_form.html.erb
@@ -0,0 +1,13 @@
<%= form_for grid, options do |f| -%>
<p>Namespaced form partial.</p>
<% grid.filters.each do |filter| %>
<div class="datagrid-filter filter">
<%= f.datagrid_label filter %>
<%= f.datagrid_filter filter %>
</div>
<% end %>
<div class="datagrid-actions">
<%= f.submit I18n.t("datagrid.form.search").html_safe, :class => "datagrid-submit" %>
<%= link_to I18n.t('datagrid.form.reset').html_safe, url_for(grid.to_param => {}), :class => "datagrid-reset" %>
</div>
<% end -%>
9 changes: 9 additions & 0 deletions spec/support/test_partials/client/datagrid/_head.html.erb
@@ -0,0 +1,9 @@
<tr>
<p>Namespaced head partial.</p>
<% grid.html_columns(*options[:columns]).each do |column| %>
<th class="<%= datagrid_column_classes(grid, column) %>">
<%= column.header %>
<%= datagrid_order_for(grid, column, options) if column.order && options[:order]%>
</th>
<% end %>
</tr>
11 changes: 11 additions & 0 deletions spec/support/test_partials/client/datagrid/_order_for.html.erb
@@ -0,0 +1,11 @@
<div class="order">
<p>Namespaced order_for partial.</p>
<%= link_to(
I18n.t("datagrid.table.order.asc").html_safe,
url_for(grid.param_name => grid.as_query.merge(:order => column.name, :descending => false)),
:class => "asc") %>
<%= link_to(
I18n.t("datagrid.table.order.desc").html_safe,
url_for(grid.param_name => grid.as_query.merge(:order => column.name, :descending => true )),
:class => "desc") %>
</div>
6 changes: 6 additions & 0 deletions spec/support/test_partials/client/datagrid/_row.html.erb
@@ -0,0 +1,6 @@
<tr class="<%= options[:cycle] && cycle(*options[:cycle]) %>">
<p>Namespaced row partial.</p>
<% grid.html_columns(*options[:columns]).each do |column| %>
<td class="<%= datagrid_column_classes(grid, column) %>"><%= datagrid_format_value(grid, column, asset) %></td>
<% end %>
</tr>
19 changes: 19 additions & 0 deletions spec/support/test_partials/client/datagrid/_table.html.erb
@@ -0,0 +1,19 @@
<%#
Local variables:
* grid - instance of Datagrid
* assets - Array of database Entities
* options - passed options Hash
%>
<p>Namespaced table partial.</p>
<%= content_tag :table, options[:html] do %>
<thead>
<%= datagrid_header(grid, options) %>
</thead>
<tbody>
<% if assets.empty? %>
<tr><td class="noresults" colspan="100%"><%= I18n.t('datagrid.no_results').html_safe %></td></tr>
<% else %>
<%= datagrid_rows(grid, assets, options) %>
<% end %>
</tbody>
<% end %>

0 comments on commit 6ecd153

Please sign in to comment.