From 6ecd15340adbae33c337bf9af96927d8a3cb2a57 Mon Sep 17 00:00:00 2001 From: Andrey Koleshko Date: Mon, 24 Mar 2014 18:31:06 +0300 Subject: [PATCH] Add facility to render datagrid partials from custom path: * :partials options is added to all helpers which may render partials --- app/views/datagrid/_head.html.erb | 2 +- lib/datagrid/helper.rb | 14 ++++++-- lib/datagrid/renderer.rb | 33 +++++++++++++++---- spec/datagrid/helper_spec.rb | 29 +++++++++++++++- .../client/datagrid/_form.html.erb | 13 ++++++++ .../client/datagrid/_head.html.erb | 9 +++++ .../client/datagrid/_order_for.html.erb | 11 +++++++ .../client/datagrid/_row.html.erb | 6 ++++ .../client/datagrid/_table.html.erb | 19 +++++++++++ 9 files changed, 125 insertions(+), 11 deletions(-) create mode 100644 spec/support/test_partials/client/datagrid/_form.html.erb create mode 100644 spec/support/test_partials/client/datagrid/_head.html.erb create mode 100644 spec/support/test_partials/client/datagrid/_order_for.html.erb create mode 100644 spec/support/test_partials/client/datagrid/_row.html.erb create mode 100644 spec/support/test_partials/client/datagrid/_table.html.erb diff --git a/app/views/datagrid/_head.html.erb b/app/views/datagrid/_head.html.erb index 8de4161d..3d1f4b70 100644 --- a/app/views/datagrid/_head.html.erb +++ b/app/views/datagrid/_head.html.erb @@ -2,7 +2,7 @@ <% grid.html_columns(*options[:columns]).each do |column| %> <%= column.header %> - <%= datagrid_order_for(grid, column) if column.order && options[:order]%> + <%= datagrid_order_for(grid, column, options) if column.order && options[:order]%> <% end %> diff --git a/lib/datagrid/helper.rb b/lib/datagrid/helper.rb index ce003c0a..9e970cfc 100644 --- a/lib/datagrid/helper.rb +++ b/lib/datagrid/helper.rb @@ -24,6 +24,8 @@ def datagrid_format_value(report, column_name, model) # * :columns - 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. + # * :partials - Path for partials lookup. + # Default: 'datagrid'. def datagrid_table(report, *args) datagrid_renderer.table(report, *args) end @@ -34,7 +36,8 @@ def datagrid_table(report, *args) # # * :order - display ordering controls built-in into header # Default: true - # + # * :partials - Path for partials lookup. + # Default: 'datagrid'. def datagrid_header(grid, options = {}) datagrid_renderer.header(grid, options) end @@ -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: + # + # * :partials - 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 diff --git a/lib/datagrid/renderer.rb b/lib/datagrid/renderer.rb index 313cda77..7876224a 100644 --- a/lib/datagrid/renderer.rb +++ b/lib/datagrid/renderer.rb @@ -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) @@ -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 diff --git a/spec/datagrid/helper_spec.rb b/spec/datagrid/helper_spec.rb index b0068b40..cb6378da 100644 --- a/spec/datagrid/helper_spec.rb +++ b/spec/datagrid/helper_spec.rb @@ -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 @@ -308,7 +328,7 @@ class TestGrid "td.name" => 1 ) end - end + end end describe ".datagrid_order_for" do @@ -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 diff --git a/spec/support/test_partials/client/datagrid/_form.html.erb b/spec/support/test_partials/client/datagrid/_form.html.erb new file mode 100644 index 00000000..c7b91f4e --- /dev/null +++ b/spec/support/test_partials/client/datagrid/_form.html.erb @@ -0,0 +1,13 @@ +<%= form_for grid, options do |f| -%> +

Namespaced form partial.

+ <% grid.filters.each do |filter| %> +
+ <%= f.datagrid_label filter %> + <%= f.datagrid_filter filter %> +
+ <% end %> +
+ <%= 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" %> +
+<% end -%> diff --git a/spec/support/test_partials/client/datagrid/_head.html.erb b/spec/support/test_partials/client/datagrid/_head.html.erb new file mode 100644 index 00000000..eba7f601 --- /dev/null +++ b/spec/support/test_partials/client/datagrid/_head.html.erb @@ -0,0 +1,9 @@ + +

Namespaced head partial.

+ <% grid.html_columns(*options[:columns]).each do |column| %> + + <%= column.header %> + <%= datagrid_order_for(grid, column, options) if column.order && options[:order]%> + + <% end %> + diff --git a/spec/support/test_partials/client/datagrid/_order_for.html.erb b/spec/support/test_partials/client/datagrid/_order_for.html.erb new file mode 100644 index 00000000..d15deefb --- /dev/null +++ b/spec/support/test_partials/client/datagrid/_order_for.html.erb @@ -0,0 +1,11 @@ +
+

Namespaced order_for partial.

+ <%= 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") %> +
diff --git a/spec/support/test_partials/client/datagrid/_row.html.erb b/spec/support/test_partials/client/datagrid/_row.html.erb new file mode 100644 index 00000000..5af1c994 --- /dev/null +++ b/spec/support/test_partials/client/datagrid/_row.html.erb @@ -0,0 +1,6 @@ + +

Namespaced row partial.

+ <% grid.html_columns(*options[:columns]).each do |column| %> + <%= datagrid_format_value(grid, column, asset) %> + <% end %> + diff --git a/spec/support/test_partials/client/datagrid/_table.html.erb b/spec/support/test_partials/client/datagrid/_table.html.erb new file mode 100644 index 00000000..4230302a --- /dev/null +++ b/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 +%> +

Namespaced table partial.

+<%= content_tag :table, options[:html] do %> + + <%= datagrid_header(grid, options) %> + + + <% if assets.empty? %> + <%= I18n.t('datagrid.no_results').html_safe %> + <% else %> + <%= datagrid_rows(grid, assets, options) %> + <% end %> + +<% end %>