From ccaca54816edb7e4e3519c31c87213c9e5cd6d48 Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Wed, 26 Aug 2015 00:06:05 +0200 Subject: [PATCH 1/7] Add filters to specify order of debates#index --- app/controllers/debates_controller.rb | 8 +++- app/models/debate.rb | 11 +++++ app/views/debates/_filter_selector.erb | 7 ++++ app/views/debates/index.html.erb | 13 +----- spec/features/debates_spec.rb | 57 ++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 app/views/debates/_filter_selector.erb diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index cf6d14f65..c0b23577d 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -1,11 +1,12 @@ class DebatesController < ApplicationController + before_action :parse_filter, only: :index before_action :authenticate_user!, except: [:index, :show] load_and_authorize_resource respond_to :html, :js def index - @debates = Debate.search(params).page(params[:page]).for_render + @debates = Debate.search(params).page(params[:page]).for_render.sort_by(@filter) set_debate_votes(@debates) end @@ -71,4 +72,9 @@ class DebatesController < ApplicationController @featured_tags = ActsAsTaggableOn::Tag.where(featured: true) end + def parse_filter + @valid_filters = ['votes', 'news', 'rated'] + @filter = @valid_filters.include?(params[:filter]) ? params[:filter] : 'news' + end + end diff --git a/app/models/debate.rb b/app/models/debate.rb index 15590fc60..194d6537b 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -40,6 +40,17 @@ class Debate < ActiveRecord::Base end end + def self.sort_by(filter) + case filter + when 'votes' + reorder(cached_votes_total: :desc) + when 'news' + reorder(created_at: :desc) + when 'rated' + reorder(cached_votes_up: :desc) + end + end + def likes cached_votes_up end diff --git a/app/views/debates/_filter_selector.erb b/app/views/debates/_filter_selector.erb new file mode 100644 index 000000000..fa26347f1 --- /dev/null +++ b/app/views/debates/_filter_selector.erb @@ -0,0 +1,7 @@ +<% options = @valid_filters.map { |f| [t("debates.index.filter_#{f}"), f] } %> + +<%= form_tag('/debates', method: 'get', class: 'inline-block') do %> + + <%= select_tag 'filter', options_for_select(options, @filter), onchange: "this.form.submit()" %> + +<% end %> diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index 59d11f37c..cf4205af6 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -4,18 +4,7 @@

<%= t("debates.index.showing") %>

- - + <%= render 'filter_selector' %>
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 22b689308..748b36c73 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -350,4 +350,61 @@ feature 'Debates' do expect(InappropiateFlag.flagged?(user, debate)).to_not be end + feature 'Debate index order filters', :js do + + before do + @debates = [create(:debate), create(:debate), create(:debate)] + create_list(:vote, 2, votable: @debates[1]) + create_list(:vote, 2, votable: @debates[0], vote_flag: false) + create(:vote, votable: @debates[0]) + end + + def expect_debate_order(order) + debate_divs = page.all("#debates .debate") + (0..2).each do |n| + expect(debate_divs[n]).to have_content(@debates[order[n]].title) + end + end + + scenario 'Default filter is newest' do + visit debates_path + + expect(page).to have_select('filter', selected: 'the newest') + expect_debate_order([2, 1, 0]) + end + + scenario 'Debates are ordered by most voted' do + visit debates_path + + select 'the most voted', from: 'filter' + expect(page).to have_select('filter', selected: 'the most voted') + + expect(find("#debates .debate", match: :first)).to have_content(@debates[0].title) # Necessary to force capybara to wait for redirect + expect(current_url).to include('filter=votes') + expect_debate_order([0, 1, 2]) + end + + scenario 'Debates are ordered by best rated' do + visit debates_path + + select 'the best rated', from: 'filter' + expect(find("#debates .debate", match: :first)).to have_content(@debates[1].title) + + expect(current_url).to include('filter=rated') + expect_debate_order([1, 0, 2]) + end + + scenario 'Debates are ordered by newest' do + visit debates_path + + select 'the most voted', from: 'filter' + expect(find("#debates .debate", match: :first)).to have_content(@debates[0].title) + + select 'the newest', from: 'filter' + expect(find("#debates .debate", match: :first)).to have_content(@debates[2].title) + + expect(current_url).to include('filter=news') + expect_debate_order([2, 1, 0]) + end + end end From 2d48966de3806b749461cfdd8b131a7858016503 Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Thu, 27 Aug 2015 09:28:56 +0200 Subject: [PATCH 2/7] Change variable name and references from "filter" to "order" --- app/controllers/debates_controller.rb | 10 +++++----- app/models/debate.rb | 4 ++-- app/views/debates/_filter_selector.erb | 7 ------- app/views/debates/_order_selector.erb | 7 +++++++ app/views/debates/index.html.erb | 2 +- config/locales/en.yml | 6 +++--- config/locales/es.yml | 6 +++--- spec/features/debates_spec.rb | 20 ++++++++++---------- 8 files changed, 31 insertions(+), 31 deletions(-) delete mode 100644 app/views/debates/_filter_selector.erb create mode 100644 app/views/debates/_order_selector.erb diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index c0b23577d..7f7556f96 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -1,12 +1,12 @@ class DebatesController < ApplicationController - before_action :parse_filter, only: :index + before_action :parse_order, only: :index before_action :authenticate_user!, except: [:index, :show] load_and_authorize_resource respond_to :html, :js def index - @debates = Debate.search(params).page(params[:page]).for_render.sort_by(@filter) + @debates = Debate.search(params).page(params[:page]).for_render.sort_by(@order) set_debate_votes(@debates) end @@ -72,9 +72,9 @@ class DebatesController < ApplicationController @featured_tags = ActsAsTaggableOn::Tag.where(featured: true) end - def parse_filter - @valid_filters = ['votes', 'news', 'rated'] - @filter = @valid_filters.include?(params[:filter]) ? params[:filter] : 'news' + def parse_order + @valid_orders = ['votes', 'news', 'rated'] + @order = @valid_orders.include?(params[:order]) ? params[:order] : 'news' end end diff --git a/app/models/debate.rb b/app/models/debate.rb index 194d6537b..9b815c6db 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -40,8 +40,8 @@ class Debate < ActiveRecord::Base end end - def self.sort_by(filter) - case filter + def self.sort_by(order) + case order when 'votes' reorder(cached_votes_total: :desc) when 'news' diff --git a/app/views/debates/_filter_selector.erb b/app/views/debates/_filter_selector.erb deleted file mode 100644 index fa26347f1..000000000 --- a/app/views/debates/_filter_selector.erb +++ /dev/null @@ -1,7 +0,0 @@ -<% options = @valid_filters.map { |f| [t("debates.index.filter_#{f}"), f] } %> - -<%= form_tag('/debates', method: 'get', class: 'inline-block') do %> - - <%= select_tag 'filter', options_for_select(options, @filter), onchange: "this.form.submit()" %> - -<% end %> diff --git a/app/views/debates/_order_selector.erb b/app/views/debates/_order_selector.erb new file mode 100644 index 000000000..6516a172d --- /dev/null +++ b/app/views/debates/_order_selector.erb @@ -0,0 +1,7 @@ +<% options = @valid_orders.map { |f| [t("debates.index.order_#{f}"), f] } %> + +<%= form_tag('/debates', method: 'get', class: 'inline-block') do %> + + <%= select_tag 'order', options_for_select(options, @order), onchange: "this.form.submit()" %> + +<% end %> diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index cf4205af6..13600160c 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -4,7 +4,7 @@

<%= t("debates.index.showing") %>

- <%= render 'filter_selector' %> + <%= render 'order_selector' %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index 322cf585f..4bc7f33e3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -33,9 +33,9 @@ en: index: create_debate: Create a debate showing: You are seeing debates - filter_news: the newest - filter_votes: the most voted - filter_rated: the best rated + order_news: the newest + order_votes: the most voted + order_rated: the best rated filter_topic: "You are seeing %{number} debates with the topic '%{topic}'" debate: debate: Debate diff --git a/config/locales/es.yml b/config/locales/es.yml index 5c21c039e..dc133aaff 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -33,9 +33,9 @@ es: index: create_debate: Crea un debate showing: "Estás viendo los debates" - filter_news: "más nuevos" - filter_votes: "más votados" - filter_rated: mejor valorados + order_news: "más nuevos" + order_votes: "más votados" + order_rated: mejor valorados filter_topic: "Estás viendo %{number} debates con el tema '%{topic}'" debate: debate: Debate diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 748b36c73..c76e4971c 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -366,44 +366,44 @@ feature 'Debates' do end end - scenario 'Default filter is newest' do + scenario 'Default order is newest' do visit debates_path - expect(page).to have_select('filter', selected: 'the newest') + expect(page).to have_select('order', selected: 'the newest') expect_debate_order([2, 1, 0]) end scenario 'Debates are ordered by most voted' do visit debates_path - select 'the most voted', from: 'filter' - expect(page).to have_select('filter', selected: 'the most voted') + select 'the most voted', from: 'order' + expect(page).to have_select('order', selected: 'the most voted') expect(find("#debates .debate", match: :first)).to have_content(@debates[0].title) # Necessary to force capybara to wait for redirect - expect(current_url).to include('filter=votes') + expect(current_url).to include('order=votes') expect_debate_order([0, 1, 2]) end scenario 'Debates are ordered by best rated' do visit debates_path - select 'the best rated', from: 'filter' + select 'the best rated', from: 'order' expect(find("#debates .debate", match: :first)).to have_content(@debates[1].title) - expect(current_url).to include('filter=rated') + expect(current_url).to include('order=rated') expect_debate_order([1, 0, 2]) end scenario 'Debates are ordered by newest' do visit debates_path - select 'the most voted', from: 'filter' + select 'the most voted', from: 'order' expect(find("#debates .debate", match: :first)).to have_content(@debates[0].title) - select 'the newest', from: 'filter' + select 'the newest', from: 'order' expect(find("#debates .debate", match: :first)).to have_content(@debates[2].title) - expect(current_url).to include('filter=news') + expect(current_url).to include('order=news') expect_debate_order([2, 1, 0]) end end From 6f32801a88393e09617ca6045009026e750748d4 Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Thu, 27 Aug 2015 09:38:02 +0200 Subject: [PATCH 3/7] Change names of debate order filters * 'news' to 'created_at' * 'votes' to 'total_votes' * 'rated' to 'likes' --- app/controllers/debates_controller.rb | 4 ++-- app/models/debate.rb | 6 +++--- config/locales/en.yml | 6 +++--- config/locales/es.yml | 6 +++--- spec/features/debates_spec.rb | 8 ++++---- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 7f7556f96..bc733c67a 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -73,8 +73,8 @@ class DebatesController < ApplicationController end def parse_order - @valid_orders = ['votes', 'news', 'rated'] - @order = @valid_orders.include?(params[:order]) ? params[:order] : 'news' + @valid_orders = ['total_votes', 'created_at', 'likes'] + @order = @valid_orders.include?(params[:order]) ? params[:order] : 'created_at' end end diff --git a/app/models/debate.rb b/app/models/debate.rb index 9b815c6db..82931dfff 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -42,11 +42,11 @@ class Debate < ActiveRecord::Base def self.sort_by(order) case order - when 'votes' + when 'total_votes' reorder(cached_votes_total: :desc) - when 'news' + when 'created_at' reorder(created_at: :desc) - when 'rated' + when 'likes' reorder(cached_votes_up: :desc) end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 4bc7f33e3..7e049594d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -33,9 +33,9 @@ en: index: create_debate: Create a debate showing: You are seeing debates - order_news: the newest - order_votes: the most voted - order_rated: the best rated + order_created_at: the newest + order_total_votes: the most voted + order_likes: the best rated filter_topic: "You are seeing %{number} debates with the topic '%{topic}'" debate: debate: Debate diff --git a/config/locales/es.yml b/config/locales/es.yml index dc133aaff..fce3bad63 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -33,9 +33,9 @@ es: index: create_debate: Crea un debate showing: "Estás viendo los debates" - order_news: "más nuevos" - order_votes: "más votados" - order_rated: mejor valorados + order_created_at: "más nuevos" + order_total_votes: "más votados" + order_likes: mejor valorados filter_topic: "Estás viendo %{number} debates con el tema '%{topic}'" debate: debate: Debate diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index c76e4971c..cf6c71829 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -366,7 +366,7 @@ feature 'Debates' do end end - scenario 'Default order is newest' do + scenario 'Default order is created_at' do visit debates_path expect(page).to have_select('order', selected: 'the newest') @@ -380,7 +380,7 @@ feature 'Debates' do expect(page).to have_select('order', selected: 'the most voted') expect(find("#debates .debate", match: :first)).to have_content(@debates[0].title) # Necessary to force capybara to wait for redirect - expect(current_url).to include('order=votes') + expect(current_url).to include('order=total_votes') expect_debate_order([0, 1, 2]) end @@ -390,7 +390,7 @@ feature 'Debates' do select 'the best rated', from: 'order' expect(find("#debates .debate", match: :first)).to have_content(@debates[1].title) - expect(current_url).to include('order=rated') + expect(current_url).to include('order=likes') expect_debate_order([1, 0, 2]) end @@ -403,7 +403,7 @@ feature 'Debates' do select 'the newest', from: 'order' expect(find("#debates .debate", match: :first)).to have_content(@debates[2].title) - expect(current_url).to include('order=news') + expect(current_url).to include('order=created_at') expect_debate_order([2, 1, 0]) end end From b6df3be8c0e00a406a84a66fea3eb674fbee6c8a Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Thu, 27 Aug 2015 12:42:05 +0200 Subject: [PATCH 4/7] Change Debate.sort_by method for individual scopes --- app/controllers/debates_controller.rb | 2 +- app/models/debate.rb | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index bc733c67a..efa441d81 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -6,7 +6,7 @@ class DebatesController < ApplicationController respond_to :html, :js def index - @debates = Debate.search(params).page(params[:page]).for_render.sort_by(@order) + @debates = Debate.search(params).page(params[:page]).for_render.send("sort_by_#{@order}") set_debate_votes(@debates) end diff --git a/app/models/debate.rb b/app/models/debate.rb index 82931dfff..779cca33a 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -28,6 +28,10 @@ class Debate < ActiveRecord::Base scope :archived, -> { where("archived_at IS NOT NULL AND hidden_at IS NULL") } scope :flagged_as_inappropiate, -> { where("inappropiate_flags_count > 0") } scope :for_render, -> { includes(:tags) } + scope :sort_by_total_votes, -> { reorder(cached_votes_total: :desc) } + scope :sort_by_likes , -> { reorder(cached_votes_up: :desc) } + scope :sort_by_created_at, -> { reorder(created_at: :desc) } + # Ahoy setup visitable # Ahoy will automatically assign visit_id on create @@ -40,17 +44,6 @@ class Debate < ActiveRecord::Base end end - def self.sort_by(order) - case order - when 'total_votes' - reorder(cached_votes_total: :desc) - when 'created_at' - reorder(created_at: :desc) - when 'likes' - reorder(cached_votes_up: :desc) - end - end - def likes cached_votes_up end From f5622b342573f0a127fab6c5c6908c788b6602d9 Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Thu, 27 Aug 2015 12:56:06 +0200 Subject: [PATCH 5/7] Assign each test debate to one variable --- spec/features/debates_spec.rb | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index cf6c71829..dfafeb7db 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -353,16 +353,20 @@ feature 'Debates' do feature 'Debate index order filters', :js do before do - @debates = [create(:debate), create(:debate), create(:debate)] - create_list(:vote, 2, votable: @debates[1]) - create_list(:vote, 2, votable: @debates[0], vote_flag: false) - create(:vote, votable: @debates[0]) + # TODO consider using debate title literally + @most_voted_debate = create(:debate) + @most_liked_debate = create(:debate) + @most_recent_debate = create(:debate) + create_list(:vote, 2, votable: @most_liked_debate) + create_list(:vote, 2, votable: @most_voted_debate, vote_flag: false) + create(:vote, votable: @most_voted_debate) end def expect_debate_order(order) + debates = [@most_voted_debate, @most_liked_debate, @most_recent_debate] debate_divs = page.all("#debates .debate") (0..2).each do |n| - expect(debate_divs[n]).to have_content(@debates[order[n]].title) + expect(debate_divs[n]).to have_content(debates[order[n]].title) end end @@ -379,7 +383,7 @@ feature 'Debates' do select 'the most voted', from: 'order' expect(page).to have_select('order', selected: 'the most voted') - expect(find("#debates .debate", match: :first)).to have_content(@debates[0].title) # Necessary to force capybara to wait for redirect + expect(find("#debates .debate", match: :first)).to have_content(@most_voted_debate.title) # Necessary to force capybara to wait for redirect expect(current_url).to include('order=total_votes') expect_debate_order([0, 1, 2]) end @@ -388,7 +392,7 @@ feature 'Debates' do visit debates_path select 'the best rated', from: 'order' - expect(find("#debates .debate", match: :first)).to have_content(@debates[1].title) + expect(find("#debates .debate", match: :first)).to have_content(@most_liked_debate.title) expect(current_url).to include('order=likes') expect_debate_order([1, 0, 2]) @@ -398,10 +402,10 @@ feature 'Debates' do visit debates_path select 'the most voted', from: 'order' - expect(find("#debates .debate", match: :first)).to have_content(@debates[0].title) + expect(find("#debates .debate", match: :first)).to have_content(@most_voted_debate.title) select 'the newest', from: 'order' - expect(find("#debates .debate", match: :first)).to have_content(@debates[2].title) + expect(find("#debates .debate", match: :first)).to have_content(@most_recent_debate.title) expect(current_url).to include('order=created_at') expect_debate_order([2, 1, 0]) From bfeff8d24193a63693ff5f2b322c84683f21d51c Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Thu, 27 Aug 2015 13:54:18 +0200 Subject: [PATCH 6/7] Implement custom rspec matcher appear_before --- spec/features/debates_spec.rb | 21 +++++++++------------ spec/features/moderation_spec.rb | 1 + spec/support/matchers/appear_before.rb | 6 ++++++ 3 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 spec/support/matchers/appear_before.rb diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index dfafeb7db..8904199b3 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -362,19 +362,13 @@ feature 'Debates' do create(:vote, votable: @most_voted_debate) end - def expect_debate_order(order) - debates = [@most_voted_debate, @most_liked_debate, @most_recent_debate] - debate_divs = page.all("#debates .debate") - (0..2).each do |n| - expect(debate_divs[n]).to have_content(debates[order[n]].title) - end - end - scenario 'Default order is created_at' do visit debates_path expect(page).to have_select('order', selected: 'the newest') - expect_debate_order([2, 1, 0]) + #expect_debate_order([2, 1, 0]) + expect(@most_recent_debate.title).to appear_before(@most_liked_debate.title) + expect(@most_liked_debate.title).to appear_before(@most_voted_debate.title) end scenario 'Debates are ordered by most voted' do @@ -385,7 +379,8 @@ feature 'Debates' do expect(find("#debates .debate", match: :first)).to have_content(@most_voted_debate.title) # Necessary to force capybara to wait for redirect expect(current_url).to include('order=total_votes') - expect_debate_order([0, 1, 2]) + expect(@most_voted_debate.title).to appear_before(@most_liked_debate.title) + expect(@most_liked_debate.title).to appear_before(@most_recent_debate.title) end scenario 'Debates are ordered by best rated' do @@ -395,7 +390,8 @@ feature 'Debates' do expect(find("#debates .debate", match: :first)).to have_content(@most_liked_debate.title) expect(current_url).to include('order=likes') - expect_debate_order([1, 0, 2]) + expect(@most_liked_debate.title).to appear_before(@most_voted_debate.title) + expect(@most_voted_debate.title).to appear_before(@most_recent_debate.title) end scenario 'Debates are ordered by newest' do @@ -408,7 +404,8 @@ feature 'Debates' do expect(find("#debates .debate", match: :first)).to have_content(@most_recent_debate.title) expect(current_url).to include('order=created_at') - expect_debate_order([2, 1, 0]) + expect(@most_recent_debate.title).to appear_before(@most_liked_debate.title) + expect(@most_liked_debate.title).to appear_before(@most_voted_debate.title) end end end diff --git a/spec/features/moderation_spec.rb b/spec/features/moderation_spec.rb index 78df5e56f..aa49d381c 100644 --- a/spec/features/moderation_spec.rb +++ b/spec/features/moderation_spec.rb @@ -1,4 +1,5 @@ require 'rails_helper' +require 'support/matchers/appear_before' feature 'Admin' do let(:user) { create(:user) } diff --git a/spec/support/matchers/appear_before.rb b/spec/support/matchers/appear_before.rb new file mode 100644 index 000000000..bb1d65072 --- /dev/null +++ b/spec/support/matchers/appear_before.rb @@ -0,0 +1,6 @@ +RSpec::Matchers.define :appear_before do |later_content| + match do |earlier_content| + page.body.index(earlier_content) < page.body.index(later_content) + end +end + From e8004ca1d3c5e6c6d64b48a0d440bf6e165ed16a Mon Sep 17 00:00:00 2001 From: Marko Lovic Date: Thu, 27 Aug 2015 14:54:04 +0200 Subject: [PATCH 7/7] Add to javascript to handle debates order change --- app/assets/javascripts/application.js | 1 + .../debates_order_selector.js.coffee | 17 +++++++++++++++++ app/helpers/debates_helper.rb | 12 ++++++++++++ app/views/debates/_order_selector.erb | 12 +++++------- spec/features/debates_spec.rb | 14 ++++++-------- spec/features/moderation_spec.rb | 1 - 6 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 app/assets/javascripts/debates_order_selector.js.coffee create mode 100644 app/helpers/debates_helper.rb diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index a5aaf5c01..6e5b1df3d 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -32,6 +32,7 @@ var initialize_modules = function() { App.Tags.initialize(); App.Stats.initialize(); App.LocaleSwitcher.initialize(); + App.DebatesOrderSelector.initialize(); }; $(function(){ diff --git a/app/assets/javascripts/debates_order_selector.js.coffee b/app/assets/javascripts/debates_order_selector.js.coffee new file mode 100644 index 000000000..94002f5ac --- /dev/null +++ b/app/assets/javascripts/debates_order_selector.js.coffee @@ -0,0 +1,17 @@ +App.DebatesOrderSelector = + + href_with_params: (query_params) -> + loc = window.location + + loc.protocol + "//" + loc.hostname + + (if loc.port then ':' + loc.port else '') + + loc.pathname + + loc.hash + + '?' + $.param(query_params) + + initialize: -> + $('.js-order-selector').on 'change', -> + query_params = window.getQueryParameters() + query_params['order'] = $(this).val() + window.location.assign(App.DebatesOrderSelector.href_with_params(query_params)) + diff --git a/app/helpers/debates_helper.rb b/app/helpers/debates_helper.rb new file mode 100644 index 000000000..52bb9c17c --- /dev/null +++ b/app/helpers/debates_helper.rb @@ -0,0 +1,12 @@ +module DebatesHelper + def available_options_for_order_selector(valid_orders, current_order) + options_for_select(available_order_filters_array(valid_orders), current_order) + end + + private + + def available_order_filters_array(orders) + orders.map { |f| [t("debates.index.order_#{f}"), f] } + end + +end diff --git a/app/views/debates/_order_selector.erb b/app/views/debates/_order_selector.erb index 6516a172d..de18cfc45 100644 --- a/app/views/debates/_order_selector.erb +++ b/app/views/debates/_order_selector.erb @@ -1,7 +1,5 @@ -<% options = @valid_orders.map { |f| [t("debates.index.order_#{f}"), f] } %> - -<%= form_tag('/debates', method: 'get', class: 'inline-block') do %> - - <%= select_tag 'order', options_for_select(options, @order), onchange: "this.form.submit()" %> - -<% end %> +
+ +
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 8904199b3..82669770d 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -365,17 +365,15 @@ feature 'Debates' do scenario 'Default order is created_at' do visit debates_path - expect(page).to have_select('order', selected: 'the newest') - #expect_debate_order([2, 1, 0]) + expect(page).to have_select('order-selector', selected: 'the newest') expect(@most_recent_debate.title).to appear_before(@most_liked_debate.title) - expect(@most_liked_debate.title).to appear_before(@most_voted_debate.title) end scenario 'Debates are ordered by most voted' do visit debates_path - select 'the most voted', from: 'order' - expect(page).to have_select('order', selected: 'the most voted') + select 'the most voted', from: 'order-selector' + expect(page).to have_select('order-selector', selected: 'the most voted') expect(find("#debates .debate", match: :first)).to have_content(@most_voted_debate.title) # Necessary to force capybara to wait for redirect expect(current_url).to include('order=total_votes') @@ -386,7 +384,7 @@ feature 'Debates' do scenario 'Debates are ordered by best rated' do visit debates_path - select 'the best rated', from: 'order' + select 'the best rated', from: 'order-selector' expect(find("#debates .debate", match: :first)).to have_content(@most_liked_debate.title) expect(current_url).to include('order=likes') @@ -397,10 +395,10 @@ feature 'Debates' do scenario 'Debates are ordered by newest' do visit debates_path - select 'the most voted', from: 'order' + select 'the most voted', from: 'order-selector' expect(find("#debates .debate", match: :first)).to have_content(@most_voted_debate.title) - select 'the newest', from: 'order' + select 'the newest', from: 'order-selector' expect(find("#debates .debate", match: :first)).to have_content(@most_recent_debate.title) expect(current_url).to include('order=created_at') diff --git a/spec/features/moderation_spec.rb b/spec/features/moderation_spec.rb index aa49d381c..78df5e56f 100644 --- a/spec/features/moderation_spec.rb +++ b/spec/features/moderation_spec.rb @@ -1,5 +1,4 @@ require 'rails_helper' -require 'support/matchers/appear_before' feature 'Admin' do let(:user) { create(:user) }