Skip to content

Commit

Permalink
Region and Chapter leader dropdowns populate using ajax
Browse files Browse the repository at this point in the history
The chapter leader dropdown has no real restrictions on who
will show up in it, like the organizers dropdown used to.
To avoid rendering a huge <select> on the page and stalling
out the user's browser, it's better to fetch the data lazily!

Also: change the chapter/region leader controller/routes:
WAS: chapter_leaderships#create ("ChapterLeadershipsController")
NOW: chapters/leaders#create ("Chapters::LeadersController")
  • Loading branch information
tjgrathwell committed Feb 16, 2016
1 parent ee08e23 commit fc68358
Show file tree
Hide file tree
Showing 15 changed files with 188 additions and 102 deletions.
43 changes: 0 additions & 43 deletions app/controllers/chapter_leaderships_controller.rb

This file was deleted.

58 changes: 58 additions & 0 deletions app/controllers/chapters/leaders_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
module Chapters
class LeadersController < ApplicationController
before_action :authenticate_user!
before_action :load_chapter
before_action :validate_authorized!

def index
@leaders = @chapter.leaders
end

def create
leader = ChapterLeadership.new(chapter: @chapter, user_id: leader_params[:id])
if leader.save
redirect_to chapter_leaders_path(@chapter), notice: "Booyah!"
else
redirect_to chapter_leaders_path(@chapter), error: "Whoops."
end
end

def destroy
leadership = ChapterLeadership.where(
chapter: @chapter,
user_id: leader_params[:id]
).first

leadership.destroy
redirect_to chapter_leaders_path(@chapter), notice: "Removed #{leadership.user.full_name} as chapter leader."
end

def potential
respond_to do |format|
format.json do
users_not_assigned = User.where(<<-SQL, @chapter.id)
id NOT IN (
SELECT user_id FROM chapter_leaderships WHERE chapter_id = ?
)
SQL

render json: UserSearcher.new(users_not_assigned, params[:q])
end
end
end

private

def load_chapter
@chapter = Chapter.find(params[:chapter_id])
end

def leader_params
params.permit(:id, :chapter_id)
end

def validate_authorized!
authorize @chapter, :modify_leadership?
end
end
end
43 changes: 0 additions & 43 deletions app/controllers/region_leaderships_controller.rb

This file was deleted.

58 changes: 58 additions & 0 deletions app/controllers/regions/leaders_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
module Regions
class LeadersController < ApplicationController
before_action :authenticate_user!
before_action :load_region
before_action :validate_authorized!

def index
@leaders = @region.leaders
end

def create
leader = RegionLeadership.new(region: @region, user_id: leader_params[:id])
if leader.save
redirect_to region_leaders_path(@region), notice: "Booyah!"
else
redirect_to region_leaders_path(@region), error: "Whoops."
end
end

def destroy
leadership = RegionLeadership.where(
region: @region,
user_id: leader_params[:id]
).first

leadership.destroy
redirect_to region_leaders_path(@region), notice: "Removed #{leadership.user.full_name} as region leader."
end

def potential
respond_to do |format|
format.json do
users_not_assigned = @region.users.where(<<-SQL, @region.id)
id NOT IN (
SELECT user_id FROM region_leaderships WHERE region_id = ?
)
SQL

render json: UserSearcher.new(users_not_assigned, params[:q])
end
end
end

private

def load_region
@region = Region.find(params[:region_id])
end

def leader_params
params.permit(:id, :region_id)
end

def validate_authorized!
authorize @region, :modify_leadership?
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

<h3>Potential Leaders</h3>
<%= render 'shared/user_chooser',
action: chapter_chapter_leaderships_path(@chapter),
action: chapter_leaders_path(@chapter),
select_id: '',
foreign_key: 'id',
choices: @users.collect {|u| [ u.full_name, u.id ] }
url: potential_chapter_leaders_path(@chapter),
choices: []
%>

<table class="table">
Expand All @@ -25,7 +26,7 @@
<td><%= leader.email %></td>
<td>
<% if leader.id != current_user.id %>
<%= button_to 'Remove', chapter_chapter_leadership_path(@chapter, leader), method: :delete,
<%= button_to 'Remove', chapter_leaders_path(@chapter, leader), method: :delete,
:form => {:style => "margin-bottom : 0;"}, :class => "btn btn-mini" %>
<% end %>
</td>
Expand Down
2 changes: 1 addition & 1 deletion app/views/chapters/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<% end %>
<% if @chapter.has_leader?(current_user) %>
<%= link_to 'Edit Chapter Leaders', chapter_chapter_leaderships_path(@chapter), class: "btn mb20" %>
<%= link_to 'Edit Chapter Leaders', chapter_leaders_path(@chapter), class: "btn mb20" %>

<h2>Organizers</h2>
<table class="datatable-sorted table table-striped table-bordered table-condensed responsive-table">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

<h3>Potential Leaders</h3>
<%= render 'shared/user_chooser',
action: region_region_leaderships_path(@region),
action: region_leaders_path(@region),
select_id: '',
foreign_key: 'id',
choices: @users.collect {|u| [ u.full_name, u.id ] }
url: potential_region_leaders_path(@region),
choices: []
%>

<table class="table">
Expand All @@ -25,7 +26,7 @@
<td><%= leader.email %></td>
<td>
<% if leader.id != current_user.id %>
<%= button_to 'Remove', region_region_leadership_path(@region, leader), method: :delete,
<%= button_to 'Remove', region_leaders_path(@region, leader), method: :delete,
:form => {:style => "margin-bottom : 0;"}, :class => "btn btn-mini" %>
<% end %>
</td>
Expand Down
2 changes: 1 addition & 1 deletion app/views/regions/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<% end %>
<% if @region.has_leader?(current_user) %>
<%= link_to 'Edit Region Leaders', region_region_leaderships_path(@region), class: "btn mb20" %>
<%= link_to 'Edit Region Leaders', region_leaders_path(@region), class: "btn mb20" %>

<h2>Organizers</h2>
<table class="datatable-sorted table table-striped table-bordered table-condensed responsive-table">
Expand Down
8 changes: 6 additions & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,14 @@

resources :locations
resources :chapters do
resources :chapter_leaderships, only: [:index, :create, :destroy]
resources :leaders, only: [:index, :create, :destroy], controller: 'chapters/leaders' do
get :potential, on: :collection
end
end
resources :regions do
resources :region_leaderships, only: [:index, :create, :destroy]
resources :leaders, only: [:index, :create, :destroy], controller: 'regions/leaders' do
get :potential, on: :collection
end
end

resources :events do
Expand Down
23 changes: 23 additions & 0 deletions spec/controllers/chapters/leaders_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
require 'rails_helper'

describe Chapters::LeadersController do
let(:admin) { create(:user, admin: true, first_name: 'Admin', last_name: 'User') }
let(:chapter) { create :chapter }

describe "potential leaders" do
before do
sign_in admin
end

it "includes all users not currently assigned as leaders" do
leader = create(:user, first_name: 'Steve')
chapter.leaders << leader

non_leader = create(:user, first_name: 'Steve')

get :potential, format: :json, chapter_id: chapter.id, q: 'Steve'

expect(JSON.parse(response.body).map { |u| u['id'] }).to eq([non_leader.id])
end
end
end
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
require 'rails_helper'

describe RegionLeadershipsController do
describe Regions::LeadersController do
let(:region) { create :region }
let(:leader) { create :user }
let(:user) { create :user }
Expand Down Expand Up @@ -77,4 +77,25 @@
end
end
end

describe "potential leaders" do
before do
sign_in create(:user, admin: true)
end

it "includes all users in the region not currently assigned as leaders" do
leader = create(:user, first_name: 'Steve')
leader.regions << region
region.leaders << leader

non_leader = create(:user, first_name: 'Steve')
non_leader.regions << region

non_region = create(:user, first_name: 'Steve')

get :potential, format: :json, region_id: region.id, q: 'Steve'

expect(JSON.parse(response.body).map { |u| u['id'] }).to eq([non_leader.id])
end
end
end
2 changes: 1 addition & 1 deletion spec/features/chapter_request_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

click_on "Edit Chapter Leaders"

find('select.select2-hidden-accessible').select(potential_leader.full_name)
fill_in_select2(potential_leader.full_name)

click_on "Assign"

Expand Down
5 changes: 1 addition & 4 deletions spec/features/event_organizers_request_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@

expect(page).to have_select('event_organizer[user_id]')

page.find('.select2-selection').click
page.find('.select2-search__field').set(@user1.full_name)
expect(page.find('.select2-results__option')).to have_content(@user1.full_name)
page.find('.select2-results__option').click
fill_in_select2(@user1.full_name)

click_button "Assign"

Expand Down
1 change: 1 addition & 0 deletions spec/rails_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
config.include Devise::TestHelpers, type: :controller
config.include SignInHelper, type: :feature
config.include EventFormHelper, type: :feature
config.include FormHelper, type: :feature

config.include FactoryGirl::Syntax::Methods

Expand Down
8 changes: 8 additions & 0 deletions spec/support/form_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module FormHelper
def fill_in_select2(option)
page.find('.select2-selection').click
page.find('.select2-search__field').set(option)
expect(page.find('.select2-results__option')).to have_content(option)
page.find('.select2-results__option').click
end
end

0 comments on commit fc68358

Please sign in to comment.