From 645d678732eb550db2c5b250aa16f5ac5e9f8d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benoit=20Be=CC=81ne=CC=81zech?= Date: Tue, 15 Nov 2011 19:37:50 +0100 Subject: [PATCH] added pjax shortened URLs as much as possible --- .../javascripts/rails_admin/jquery.pjax.js | 266 ++++++++++++++++++ .../javascripts/rails_admin/ra.filter-box.js | 8 +- .../rails_admin/rails_admin.js.erb | 1 + .../javascripts/rails_admin/ui.js.coffee | 14 +- .../rails_admin/main_controller.rb | 2 +- .../twitter-bootstrap/_next_page.html.haml | 2 +- .../twitter-bootstrap/_page.html.haml | 4 +- .../twitter-bootstrap/_prev_page.html.haml | 2 +- app/views/rails_admin/main/index.html.haml | 46 +-- lib/rails_admin/adapters/active_record.rb | 2 +- lib/rails_admin/engine.rb | 5 + rails_admin.gemspec | 1 + .../basic/list/rails_admin_basic_list_spec.rb | 22 +- 13 files changed, 330 insertions(+), 45 deletions(-) create mode 100644 app/assets/javascripts/rails_admin/jquery.pjax.js diff --git a/app/assets/javascripts/rails_admin/jquery.pjax.js b/app/assets/javascripts/rails_admin/jquery.pjax.js new file mode 100644 index 0000000000..cc152b5b1d --- /dev/null +++ b/app/assets/javascripts/rails_admin/jquery.pjax.js @@ -0,0 +1,266 @@ +// jquery.pjax.js +// copyright chris wanstrath +// https://github.com/defunkt/jquery-pjax + +(function($){ + +// When called on a link, fetches the href with ajax into the +// container specified as the first parameter or with the data-pjax +// attribute on the link itself. +// +// Tries to make sure the back button and ctrl+click work the way +// you'd expect. +// +// Accepts a jQuery ajax options object that may include these +// pjax specific options: +// +// container - Where to stick the response body. Usually a String selector. +// $(container).html(xhr.responseBody) +// push - Whether to pushState the URL. Defaults to true (of course). +// replace - Want to use replaceState instead? That's cool. +// +// For convenience the first parameter can be either the container or +// the options object. +// +// Returns the jQuery object +$.fn.pjax = function( container, options ) { + if ( options ) + options.container = container + else + options = $.isPlainObject(container) ? container : {container:container} + + // We can't persist $objects using the history API so we must use + // a String selector. Bail if we got anything else. + if ( options.container && typeof options.container !== 'string' ) { + throw "pjax container must be a string selector!" + return false + } + + return this.live('click', function(event){ + // Middle click, cmd click, and ctrl click should open + // links in a new tab as normal. + if ( event.which > 1 || event.metaKey ) + return true + + var defaults = { + url: (this.href || $(this).attr('data-href')), + container: $(this).attr('data-pjax'), + clickedElement: $(this), + fragment: null + } + + $.pjax($.extend({}, defaults, options)) + + event.preventDefault() + }) +} + + +// Loads a URL with ajax, puts the response body inside a container, +// then pushState()'s the loaded URL. +// +// Works just like $.ajax in that it accepts a jQuery ajax +// settings object (with keys like url, type, data, etc). +// +// Accepts these extra keys: +// +// container - Where to stick the response body. Must be a String. +// $(container).html(xhr.responseBody) +// push - Whether to pushState the URL. Defaults to true (of course). +// replace - Want to use replaceState instead? That's cool. +// +// Use it just like $.ajax: +// +// var xhr = $.pjax({ url: this.href, container: '#main' }) +// console.log( xhr.readyState ) +// +// Returns whatever $.ajax returns. +var pjax = $.pjax = function( options ) { + var $container = $(options.container), + success = options.success || $.noop + + // We don't want to let anyone override our success handler. + delete options.success + + // We can't persist $objects using the history API so we must use + // a String selector. Bail if we got anything else. + if ( typeof options.container !== 'string' ) + throw "pjax container must be a string selector!" + + options = $.extend(true, {}, pjax.defaults, options) + + if ( $.isFunction(options.url) ) { + options.url = options.url() + } + + options.context = $container + options.success = function(data){ + if ( options.fragment ) { + // If they specified a fragment, look for it in the response + // and pull it out. + var $fragment = $(data).find(options.fragment) + if ( $fragment.length ) + data = $fragment.children() + else + return window.location = options.url + } else { + // If we got no data or an entire web page, go directly + // to the page and let normal error handling happen. + if ( !$.trim(data) || / tag in the response, use it as + // the page's title. + var oldTitle = document.title, + title = $.trim( this.find('title').remove().text() ) + if ( title ) document.title = title + + // No ? Fragment? Look for data-title and title attributes. + if ( !title && options.fragment ) { + title = $fragment.attr('title') || $fragment.data('title') + } + + var state = { + pjax: options.container, + fragment: options.fragment, + timeout: options.timeout + } + + // If there are extra params, save the complete URL in the state object + var query = $.param(options.data) + if ( query != "_pjax=true" ) + state.url = options.url + (/\?/.test(options.url) ? "&" : "?") + query + + if ( options.replace ) { + window.history.replaceState(state, document.title, options.url) + } else if ( options.push ) { + // this extra replaceState before first push ensures good back + // button behavior + if ( !pjax.active ) { + window.history.replaceState($.extend({}, state, {url:null}), oldTitle) + pjax.active = true + } + + window.history.pushState(state, document.title, options.url) + } + + // Google Analytics support + if ( (options.replace || options.push) && window._gaq ) + _gaq.push(['_trackPageview']) + + // If the URL has a hash in it, make sure the browser + // knows to navigate to the hash. + var hash = window.location.hash.toString() + if ( hash !== '' ) { + window.location.href = hash + } + + // Invoke their success handler if they gave us one. + success.apply(this, arguments) + } + + // Cancel the current request if we're already pjaxing + var xhr = pjax.xhr + if ( xhr && xhr.readyState < 4) { + xhr.onreadystatechange = $.noop + xhr.abort() + } + + pjax.options = options + pjax.xhr = $.ajax(options) + $(document).trigger('pjax', [pjax.xhr, options]) + + return pjax.xhr +} + + +pjax.defaults = { + timeout: 2000, + push: true, + replace: false, + // We want the browser to maintain two separate internal caches: one for + // pjax'd partial page loads and one for normal page loads. Without + // adding this secret parameter, some browsers will often confuse the two. + data: { _pjax: true }, + type: 'GET', + dataType: 'html', + beforeSend: function(xhr){ + this.trigger('pjax:start', [xhr, pjax.options]) + // start.pjax is deprecated + this.trigger('start.pjax', [xhr, pjax.options]) + xhr.setRequestHeader('X-PJAX', 'true') + }, + error: function(xhr, textStatus, errorThrown){ + if ( textStatus !== 'abort' ) { + // console.log(xhr, textStatus, errorThrown) + window.location = pjax.options.url + } + + }, + complete: function(xhr){ + this.trigger('pjax:end', [xhr, pjax.options]) + // end.pjax is deprecated + this.trigger('end.pjax', [xhr, pjax.options]) + } +} + + +// Used to detect initial (useless) popstate. +// If history.state exists, assume browser isn't going to fire initial popstate. +var popped = ('state' in window.history), initialURL = location.href + + +// popstate handler takes care of the back and forward buttons +// +// You probably shouldn't use pjax on pages with other pushState +// stuff yet. +$(window).bind('popstate', function(event){ + // Ignore inital popstate that some browsers fire on page load + var initialPop = !popped && location.href == initialURL + popped = true + if ( initialPop ) return + + var state = event.state + + if ( state && state.pjax ) { + var container = state.pjax + if ( $(container+'').length ) + $.pjax({ + url: state.url || location.href, + fragment: state.fragment, + container: container, + push: false, + timeout: state.timeout + }) + else + window.location = location.href + } +}) + + +// Add the state property to jQuery's event object so we can use it in +// $(window).bind('popstate') +if ( $.inArray('state', $.event.props) < 0 ) + $.event.props.push('state') + + +// Is pjax supported by this browser? +$.support.pjax = + window.history && window.history.pushState && window.history.replaceState + // pushState isn't reliable on iOS yet. + && !navigator.userAgent.match(/(iPod|iPhone|iPad|WebApps\/.+CFNetwork)/) + + +// Fall back to normalcy for older browsers. +if ( !$.support.pjax ) { + $.pjax = function( options ) { + window.location = $.isFunction(options.url) ? options.url() : options.url + } + $.fn.pjax = function() { return this } +} + +})(jQuery); diff --git a/app/assets/javascripts/rails_admin/ra.filter-box.js b/app/assets/javascripts/rails_admin/ra.filter-box.js index 02e2912426..a476d1696e 100644 --- a/app/assets/javascripts/rails_admin/ra.filter-box.js +++ b/app/assets/javascripts/rails_admin/ra.filter-box.js @@ -4,8 +4,8 @@ $.filters = filters = { append: function(field_label, field_name, field_type, field_value, field_operator, field_options, multiple_values, index) { - var value_name = 'filters[' + field_name + '][' + index + '][value]'; - var operator_name = 'filters[' + field_name + '][' + index + '][operator]'; + var value_name = 'f[' + field_name + '][' + index + '][v]'; + var operator_name = 'f[' + field_name + '][' + index + '][o]'; switch(field_type) { case 'boolean': var control = '<select class="span3 " name="' + value_name + '">' + @@ -71,7 +71,7 @@ var content = '<div class="row filter clearfix">' + '<span class="span3">' + - '<span data-original-title="Click to remove this filter" rel="twipsy" class="btn info delete" data-disabler-name="filters[' + field_name + '][' + index + '][disabled]">' + field_label + '</span>' + + '<span data-original-title="Click to remove this filter" rel="twipsy" class="btn info delete" data-disabler-name="f[' + field_name + '][' + index + '][disabled]">' + field_label + '</span>' + '</span>' + '<span class="span3">'+ control + @@ -91,7 +91,7 @@ $(this).data('field-operator'), $(this).data('field-options'), $(this).data('field-multiple_values'), - $.now() + $.now().toString().slice(7,11) ); $("[rel=twipsy]").twipsy(); }); diff --git a/app/assets/javascripts/rails_admin/rails_admin.js.erb b/app/assets/javascripts/rails_admin/rails_admin.js.erb index f21ca168f0..acf37125d6 100644 --- a/app/assets/javascripts/rails_admin/rails_admin.js.erb +++ b/app/assets/javascripts/rails_admin/rails_admin.js.erb @@ -2,6 +2,7 @@ theme = :default require_asset 'rails_admin/jquery-1.6.4.min' require_asset 'jquery_ujs' + require_asset 'rails_admin/jquery.pjax' require_asset 'jquery.remotipart' require_asset 'rails_admin/jquery-ui-1.8.16.custom.js' require_asset 'bootstrap' diff --git a/app/assets/javascripts/rails_admin/ui.js.coffee b/app/assets/javascripts/rails_admin/ui.js.coffee index 1345cdabbd..db9d217fa4 100644 --- a/app/assets/javascripts/rails_admin/ui.js.coffee +++ b/app/assets/javascripts/rails_admin/ui.js.coffee @@ -12,19 +12,21 @@ $("#list input.checkbox.toggle").live "click", -> $("#list a, #list form").live "ajax:complete", (xhr, data, status) -> $("#list").replaceWith data.responseText -$("#list table th.header").live "click", -> - $.ajax - url: $(this).data("link") - success: (data) -> - $("#list").replaceWith data - $("table#history th.header").live "click", -> window.location = $(this).data("link") $(document).ready -> + $('.pjax').pjax('[data-pjax-container]') + $('.pjax-form').live 'submit', (event) -> + event.preventDefault() + $.pjax + container: '[data-pjax-container]' + url: this.action + (if (this.action.indexOf('?') != -1) then '&' else '?') + $(this).serialize() $(".alert-message").alert() $("[rel=twipsy]").twipsy() $('.animate-width-to').each -> length = $(this).data("animate-length") width = $(this).data("animate-width-to") $(this).animate(width: width, length, 'easeOutQuad') + + diff --git a/app/controllers/rails_admin/main_controller.rb b/app/controllers/rails_admin/main_controller.rb index e654c7b6d1..96c21ba4b8 100644 --- a/app/controllers/rails_admin/main_controller.rb +++ b/app/controllers/rails_admin/main_controller.rb @@ -342,7 +342,7 @@ def get_collection(model_config, scope) options = options.merge(:page => (params[:page] || 1).to_i, :per => (params[:per] || model_config.list.items_per_page)) unless params[:associated_collection] || params[:all] options = options.merge(:include => associations) unless associations.blank? options = options.merge(get_sort_hash(model_config)) unless params[:associated_collection] - options = options.merge(model_config.abstract_model.get_conditions_hash(model_config, params[:query], params[:filters])) if params[:query] || params[:filters] + options = options.merge(model_config.abstract_model.get_conditions_hash(model_config, params[:query], params[:f])) if params[:query] || params[:f] options = options.merge(:bulk_ids => params[:bulk_ids]) if params[:bulk_ids] objects = model_config.abstract_model.all(options, scope) diff --git a/app/views/kaminari/twitter-bootstrap/_next_page.html.haml b/app/views/kaminari/twitter-bootstrap/_next_page.html.haml index 6e10c63dce..931e430c96 100644 --- a/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +++ b/app/views/kaminari/twitter-bootstrap/_next_page.html.haml @@ -1,4 +1,4 @@ - if current_page.last? %li.next.disabled= link_to raw(t 'views.pagination.next'), '#' - else - %li.next= link_to raw(t 'views.pagination.next'), url, :remote => remote \ No newline at end of file + %li.next= link_to raw(t 'views.pagination.next'), url, :class => (remote ? 'pjax' : '') \ No newline at end of file diff --git a/app/views/kaminari/twitter-bootstrap/_page.html.haml b/app/views/kaminari/twitter-bootstrap/_page.html.haml index aca95b8730..f7fe3c7efb 100644 --- a/app/views/kaminari/twitter-bootstrap/_page.html.haml +++ b/app/views/kaminari/twitter-bootstrap/_page.html.haml @@ -1,4 +1,4 @@ - if page.current? - %li.active= link_to page, url, :remote => remote + %li.active= link_to page, url, :class => (remote ? 'pjax' : '') - else - %li= link_to page, url, :remote => remote + %li= link_to page, url, :class => (remote ? 'pjax' : '') diff --git a/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml b/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml index 3179c4d5d0..781126e6e2 100644 --- a/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +++ b/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml @@ -1,4 +1,4 @@ - if current_page.first? %li.prev.disabled= link_to raw(t 'views.pagination.previous'), '#' - else - %li.prev= link_to raw(t 'views.pagination.previous'), url, :remote => remote \ No newline at end of file + %li.prev= link_to raw(t 'views.pagination.previous'), url, :class => (remote ? 'pjax' : '') \ No newline at end of file diff --git a/app/views/rails_admin/main/index.html.haml b/app/views/rails_admin/main/index.html.haml index 916147753c..64eeb5e15b 100644 --- a/app/views/rails_admin/main/index.html.haml +++ b/app/views/rails_admin/main/index.html.haml @@ -1,8 +1,14 @@ :ruby query = params[:query] - params = request.params.except(:authenticity_token, :action, :controller, :utf8, :bulk_export) - sort = params[:sort] + params = request.params.except(:authenticity_token, :action, :controller, :utf8, :bulk_export, :_pjax) + params.delete(:query) if params[:query].blank? + params.delete(:sort_reverse) unless params[:sort_reverse] == 'true' sort_reverse = params[:sort_reverse] + sort = params[:sort] + params.delete(:sort) if params[:sort] == @model_config.list.sort_by.to_s + + + properties = @model_config.list.with(:view => self, :object => @abstract_model.model.new).visible_fields # columns paginate @filterable_fields = @model_config.list.fields.select(&:filterable?) @@ -11,10 +17,14 @@ other_left = ((params[:set].to_i - 1) >= 0) && sets[params[:set].to_i - 1].present? other_right = sets[params[:set].to_i + 1].present? @index = 0 - @ordered_filters = (params[:filters] || @model_config.list.filters).inject({}) { |memo, filter| + @ordered_filters = (params[:f] || @model_config.list.filters).inject({}) { |memo, filter| field_name = filter.is_a?(Array) ? filter.first : filter (filter.is_a?(Array) ? filter.last : { (@index += 1) => { "value" => '' } }) .each do |index, filter_hash| - memo[index] = { field_name => filter_hash } unless filter_hash['disabled'] + unless filter_hash['disabled'] + memo[index] = { field_name => filter_hash } + else + params[:f].delete(field_name) + end end memo }.to_a.sort_by(&:first) @@ -31,13 +41,9 @@ else '' end - "$.filters.append('#{escape_javascript field.label.to_s}', '#{escape_javascript field.name.to_s}', '#{escape_javascript field.type.to_s}', '#{escape_javascript filter_hash['value'].to_s}', '#{escape_javascript filter_hash['operator'].to_s}', '#{escape_javascript field_options.to_s}', #{filter_hash['value'].is_a?(Array)}, '#{escape_javascript filter_index.to_s}');" + "$.filters.append('#{escape_javascript field.label.to_s}', '#{escape_javascript field.name.to_s}', '#{escape_javascript field.type.to_s}', '#{escape_javascript filter_hash['v'].to_s}', '#{escape_javascript filter_hash['o'].to_s}', '#{escape_javascript field_options.to_s}', #{filter_hash['v'].is_a?(Array)}, '#{escape_javascript filter_index.to_s}');" end.join if @ordered_filters -%script - jQuery(function($) { - = @ordered_filter_string - }); - can_bulk_action = (authorized?(:export, @abstract_model) || authorized?(:delete, @abstract_model)) - show_label = t("admin.index.show_action") @@ -45,12 +51,16 @@ - edit_label = t("admin.index.edit_action") - history_label = t("admin.breadcrumbs.for_object") -#list +#list{:'data-pjax-container' => true} + %script + jQuery(function($) { + = @ordered_filter_string + }); %style - properties.select{ |p| p.column_width.present? }.each do |property| = "#list th.#{property.css_class} { width: #{property.column_width}px; min-width: #{property.column_width}px; }" = "#list td.#{property.css_class} { max-width: #{property.column_width}px; }" - = form_tag(index_path(params.except(*%w[page filters query])), :method => :post, :remote => true) do + = form_tag(index_path(params.except(*%w[page f query])), :method => :get, :class => "pjax-form") do .row .span12 #filters_box @@ -59,7 +69,7 @@ %input{:name => "query", :type => "search", :value => query, :placeholder => t("admin.index.search")} .span3 %button.btn.primary{:type => "submit", :'data-disable-with' => t("admin.index.refresh")}= t("admin.index.refresh") - %span{:style => 'float:right'}=link_to t("admin.index.export_current_action"), export_path(params.except('page')), :class => 'btn info' + %span{:style => 'float:right'}=link_to t("admin.index.export_current_action"), export_path(params.except('set').except('page')), :class => 'btn info' = form_tag bulk_action_path(:model_name => @abstract_model.to_param), :method => :post, :id => "bulk_form", :class => "form" do = hidden_field_tag :bulk_action @@ -74,9 +84,9 @@ - properties.each do |property| - selected = (sort == property.name.to_s) - if property.sortable - - sort_location = index_path params.except('page').merge(:sort => property.name, :sort_reverse => (selected && sort_reverse != 'true') ? 'true' : 'false') + - sort_location = index_path params.except('sort_reverse').except('page').merge(:sort => property.name).merge(selected && sort_reverse != "true" ? {:sort_reverse => "true"} : {}) - sort_direction = selected ? (sort_reverse == 'true' ? "headerSortUp" : "headerSortDown") : nil - %th{:class => "#{property.sortable && "header" || nil} #{property.sortable && sort_direction ? sort_direction : nil} #{property.css_class} #{property.type_css_class}", :'data-link' => (property.sortable && sort_location)}= property.label + %th{:class => "pjax #{property.sortable && "header" || nil} #{property.sortable && sort_direction ? sort_direction : nil} #{property.css_class} #{property.type_css_class}", :'data-href' => (property.sortable && sort_location)}= property.label - if other_right %th.other.right.shrink= "..." %th.last.shrink @@ -86,19 +96,19 @@ %td.select.action - if can_bulk_action = check_box_tag "bulk_ids[]", object.id, false, :id => "bulk_ids_#{object.id}", :class => "checkbox" - - if other_left_link ||= other_left && index_path(params.merge(:set => (params[:set].to_i - 1))) - %td.other.left= link_to "...", other_left_link, :remote => true + - if other_left_link ||= other_left && index_path(params.except('set').merge(params[:set].to_i != 1 ? {:set => (params[:set].to_i - 1)} : {})) + %td.other.left= link_to "...", other_left_link, :class => 'pjax' - properties.map{ |property| property.bind(:object, object) }.each do |property| - value = property.pretty_value %td{:class => "#{property.css_class} #{property.type_css_class}", :title => strip_tags(value)}= value - if other_right_link ||= other_right && index_path(params.merge(:set => (params[:set].to_i + 1))) - %td.other.right= link_to "...", other_right_link, :remote => true + %td.other.right= link_to "...", other_right_link, :class => 'pjax' %td.last.links %ul.inline= render :partial => 'rails_admin/main/object_links', :locals => { :add_active_class => false, :model_name => params[:model_name], :object => object } - unless params[:all] - total_count = @objects.total_count = paginate(@objects, :theme => 'twitter-bootstrap', :remote => true) - = link_to(t("admin.index.show_all"), index_path(params.merge(:all => true)), :class => "show-all btn clearfix", :remote => true) unless total_count > 100 || total_count <= @objects.size + = link_to(t("admin.index.show_all"), index_path(params.merge(:all => true)), :class => "show-all btn clearfix pjax") unless total_count > 100 || total_count <= @objects.size .clearfix.total-count= "#{total_count} #{@model_config.label_plural.downcase}" - else .clearfix.total-count= "#{@objects.size} #{@model_config.label_plural.downcase}" diff --git a/lib/rails_admin/adapters/active_record.rb b/lib/rails_admin/adapters/active_record.rb index 4ba002f63d..eac107850a 100644 --- a/lib/rails_admin/adapters/active_record.rb +++ b/lib/rails_admin/adapters/active_record.rb @@ -189,7 +189,7 @@ def get_conditions_hash(model_config, query, filters) field_statements = [] @filterable_fields[field_name.to_sym].each do |field_infos| unless filter_dump[:disabled] - statement, value1, value2 = build_statement(field_infos[:column], field_infos[:type], filter_dump[:value], (filter_dump[:operator] || 'default')) + statement, value1, value2 = build_statement(field_infos[:column], field_infos[:type], filter_dump[:v], (filter_dump[:o] || 'default')) if statement field_statements << statement values << value1 unless value1.nil? diff --git a/lib/rails_admin/engine.rb b/lib/rails_admin/engine.rb index e9c8b55f07..1d06a1dc5c 100644 --- a/lib/rails_admin/engine.rb +++ b/lib/rails_admin/engine.rb @@ -3,6 +3,7 @@ require 'remotipart' require 'bootstrap-sass' require 'kaminari' +require 'rack-pjax' require 'rails_admin' module RailsAdmin @@ -11,5 +12,9 @@ class Engine < Rails::Engine initializer "RailsAdmin precompile hook" do |app| app.config.assets.precompile += ['rails_admin/rails_admin.js', 'rails_admin/rails_admin.css', 'rails_admin/jquery.colorpicker.js', 'rails_admin/jquery.colorpicker.css'] end + + initializer "RailsAdmin pjax hook" do |app| + app.config.middleware.use Rack::Pjax + end end end diff --git a/rails_admin.gemspec b/rails_admin.gemspec index 5dbd695998..12f57a8a32 100644 --- a/rails_admin.gemspec +++ b/rails_admin.gemspec @@ -11,6 +11,7 @@ Gem::Specification.new do |gem| gem.add_dependency 'kaminari', '~> 0.12.4' gem.add_dependency 'rails', '~> 3.1' gem.add_dependency 'remotipart', '~> 1.0' + gem.add_dependency 'rack-pjax' gem.add_development_dependency 'capybara' gem.add_development_dependency 'carrierwave' gem.add_development_dependency 'devise' diff --git a/spec/requests/basic/list/rails_admin_basic_list_spec.rb b/spec/requests/basic/list/rails_admin_basic_list_spec.rb index 71511dec95..2e386b13be 100644 --- a/spec/requests/basic/list/rails_admin_basic_list_spec.rb +++ b/spec/requests/basic/list/rails_admin_basic_list_spec.rb @@ -88,7 +88,7 @@ end it "should allow to filter on one attribute" do - visit index_path(:model_name => "player", :filters => {:injured => {"1" => {:value => "true"}}}) + visit index_path(:model_name => "player", :f => {:injured => {"1" => {:v => "true"}}}) should have_content(@players[0].name) should have_no_content(@players[1].name) should have_content(@players[2].name) @@ -96,7 +96,7 @@ end it "should allow to combine filters on two different attributes" do - visit index_path(:model_name => "player", :filters => {:retired => {"1" => {:value => "true"}}, :injured => {"1" => {:value => "true"}}}) + visit index_path(:model_name => "player", :f => {:retired => {"1" => {:v => "true"}}, :injured => {"1" => {:v => "true"}}}) should have_content(@players[0].name) (1..3).each do |i| should have_no_content(@players[i].name) @@ -104,7 +104,7 @@ end it "should allow to filter on belongs_to relationships" do - visit index_path(:model_name => "player", :filters => {:team => {"1" => { :value => @teams[0].name }}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => { :v => @teams[0].name }}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) @@ -134,7 +134,7 @@ end end end - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.id}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.id}}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) @@ -152,7 +152,7 @@ end end end - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.name}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) @@ -169,7 +169,7 @@ end end end - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.name}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) @@ -186,7 +186,7 @@ end end end - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.name}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) @@ -201,7 +201,7 @@ field :team end end - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.name}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) @@ -218,7 +218,7 @@ end end end - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.name}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) @@ -235,13 +235,13 @@ end end end - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.name}, "2" => {:value => @teams.first.id}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}, "2" => {:v => @teams.first.id}}}) should have_content(@players[0].name) should have_content(@players[1].name) should have_no_content(@players[2].name) should have_no_content(@players[3].name) # same with a different id - visit index_path(:model_name => "player", :filters => {:team => {"1" => {:value => @teams.first.name}, "2" => {:value => @teams.last.id}}}) + visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}, "2" => {:v => @teams.last.id}}}) should have_no_content(@players[0].name) should have_no_content(@players[1].name) should have_no_content(@players[2].name)