Skip to content

Commit

Permalink
Allow league managers to undo keepers
Browse files Browse the repository at this point in the history
  • Loading branch information
Josh Prince committed Jul 14, 2015
1 parent f00dfe8 commit c12c7a0
Show file tree
Hide file tree
Showing 9 changed files with 137 additions and 35 deletions.
47 changes: 35 additions & 12 deletions app/assets/javascripts/components/keepers.js.jsx.coffee
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
getFirstOption = (options) ->
if _(options).any() then options[0].value else null
getFirstOption = (options) -> if _(options).any() then options[0].value else null

@KeepersForm = React.createClass
componentWillReceiveProps: (newProps) ->
Expand All @@ -16,16 +15,16 @@ getFirstOption = (options) ->
_(@props.players).filter({position: (position or @state.selectedPosition)})
handleKeeperSubmit: (e) ->
e.preventDefault()
url = "/leagues/#{@props.league}/keepers"
$.ajax
url: @props.url
dataType: 'json'
type: 'POST'
data:
pickId: @state.selectedPick
playerId: @state.selectedPlayer
success: (updatedData, status) =>
@props.afterSubmit(updatedData)
error: ((xhr, status, err) -> console.error @props.url, status, err.toString()).bind(@)
method: 'POST'
url: url
success: (updatedData, status) => @props.afterSubmit(updatedData)
error: ((xhr, status, err) -> console.error url, status, err.toString()).bind(@)
selectPick: (selection) -> @setState({ selectedPick: selection })
selectPlayer: (selection) -> @setState({ selectedPlayer: selection })
selectPosition: (selection) ->
Expand All @@ -52,11 +51,29 @@ getFirstOption = (options) ->
</form>`

@KeeperList = React.createClass
componentWillReceiveProps: (newProps) ->
@setState({ selectedTeamKeepers: @getKeepersForTeam(newProps.keepers, newProps.selectedTeam) })
getInitialState: ->
selectedTeamKeepers: @getKeepersForTeam(@props.keepers, @props.selectedTeam)
getKeepersForTeam: (keepers, selectedTeam) ->
_(keepers).filter(team: parseInt(selectedTeam))
handleKeeperRemove: (index, e) ->
e.preventDefault()
url = "/leagues/#{@props.league}/keepers"
$.ajax
dataType: 'json'
method: 'DELETE'
url: url + '?' + $.param({ 'pickId': @state.selectedTeamKeepers[index].pick_id })
success: (updatedData, status) => @props.afterRemove(updatedData)
error: ((xhr, status, err) -> console.error url, status, err.toString()).bind(@)
render: ->
filteredKeepers = _(@props.keepers).filter(team: parseInt(@props.selectedTeam))
keepers = filteredKeepers.map (player, i) ->
keepers = @state.selectedTeamKeepers.map ((player, i) ->
keeperText = "#{player.player_name} - #{player.pick}"
`<li className="keeper" key={i}>{keeperText}</li>`
`<li className="keeper" key={i}>
{keeperText}
<a className="remove" onClick={this.handleKeeperRemove.bind(this, i)}>X</a>
</li>`
).bind(@)

`<div>
<ol>
Expand All @@ -81,12 +98,18 @@ getFirstOption = (options) ->
<hr />
<KeepersForm
afterSubmit={this.refreshData}
league={this.props.league}
picks={this.state.picks}
players={this.state.players}
positions={this.props.positions}
selectedTeam={this.state.selectedTeam}
teams={this.props.teams}
url={"/leagues/" + this.props.league + "/keepers"} />
/>
<hr />
<KeeperList keepers={this.state.keepers} selectedTeam={this.state.selectedTeam} />
<KeeperList
afterRemove={this.refreshData}
keepers={this.state.keepers}
league={this.props.league}
selectedTeam={this.state.selectedTeam}
/>
</div>`
3 changes: 3 additions & 0 deletions app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
a.remove {
cursor: pointer;
}
ul.hmenu {
list-style: none;
margin: 0 0 2em;
Expand Down
18 changes: 17 additions & 1 deletion app/controllers/keepers_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,24 @@ def create

if keeper_pick.save
flash.alert = 'Saved successfully'
redirect_to edit_league_keepers_path(league_id)
redirect_to :back
else
flash.alert = 'Unable to save keeper'
end
end

def destroy
keeper_pick = Pick.find(destroy_params)
keeper_pick.player_id = nil
keeper_pick.keeper = false
if keeper_pick.save
flash.alert = 'Removed successfully'
redirect_to action: :edit, status: 303
else
flash.alert = 'Unable to remove keeper'
end
end

def edit
@league = League.find(league_id)
sport = Sport.find(@league.sport.id)
Expand All @@ -29,6 +41,10 @@ def create_params
params.permit(:pick_id, :player_id)
end

def destroy_params
params.require(:pick_id)
end

def league_id
params.require(:league_id)
end
Expand Down
1 change: 1 addition & 0 deletions app/views/keepers/edit.json.jbuilder
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ json.keepers(@keepers) do |keeper|
pick = @league.picks.find_by(player_id: keeper.id)

json.pick "Rd: #{pick.round}, Pick: #{pick.round_pick} (#{pick.overall_pick} overall)"
json.pick_id pick.id
json.player_name keeper.first_name.empty? ? keeper.last_name : "#{keeper.last_name}, #{keeper.first_name}"
json.team pick.team_id
end
Expand Down
2 changes: 1 addition & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
resources :leagues do
resource :draft, only: :show
resource :draft_results, only: [:create, :show]
resource :keepers, only: [:create, :edit]
resource :keepers, only: [:create, :destroy, :edit]
resources :teams
get 'draft_order',
to: 'draft_order#edit'
Expand Down
54 changes: 33 additions & 21 deletions spec/features/league_manager_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
scenario 'can generate draft picks when the league is full' do
league = create(:football_league, user: @manager)
navigate_to_league
expect(page).to have_no_link 'Set draft order'
expect(league_on_page).to have_no_link 'Set draft order'

fill_league league
visit current_path
reload_page

click_link 'Set draft order'
click_button 'Generate draft picks'
Expand All @@ -37,72 +37,80 @@
expect(page).to have_revised_draft_order
end

scenario 'can associate keepers with teams after picks are generated', js: true do
scenario 'can manage keepers after picks are generated', js: true do
league = create(:football_league, user: @manager)
fill_league league
create_player_pool
navigate_to_league
expect(page).to have_no_link 'Set keepers'
expect(league_on_page).to have_no_link 'Set keepers'

click_link 'Set draft order'
click_button 'Generate draft picks'

click_link 'League Home'
click_link 'Set keepers'

first_team = Team.first
first_qb = Player.where(position: 'QB').first
first_qb_name = "#{first_qb.last_name}, #{first_qb.first_name}"

expect(page).to have_select('team-select', selected: first_team.name)
expect(page).to have_select('position-select', selected: 'QB')
expect(page).to have_select('player-select', selected: first_qb_name)
expect(page).to have_select('pick-select', selected: 'Rd: 1, Pick: 12 (12 overall)')
expect(keeper_page).to have_selected_team(first_team.name)
expect(keeper_page).to have_selected_position('QB')
expect(keeper_page).to have_selected_player(first_qb_name)
expect(keeper_page).to have_selected_pick('Rd: 1, Pick: 12 (12 overall)')

last_team = Team.last
first_rb = Player.where(position: 'RB').first
first_rb_name = "#{first_rb.last_name}, #{first_rb.first_name}"
last_teams_first_pick = 'Rd: 1, Pick: 1 (1 overall)'

select(last_team.name, from: 'team-select')
select('RB', from: 'position-select')
expect(page).to have_select('player-select', selected: first_rb_name)
expect(page).to have_select('pick-select', selected: last_teams_first_pick)
keeper_page.select_team(last_team.name)
keeper_page.select_position('RB')
expect(keeper_page).to have_selected_player(first_rb_name)
expect(keeper_page).to have_selected_pick(last_teams_first_pick)

click_button 'Save'
expect(page).to have_css('.keeper', text: "#{first_rb_name} - #{last_teams_first_pick}")
expect(keeper_page).to have_keeper(first_rb_name, last_teams_first_pick)

click_link 'League Home'
click_link 'View draft order'
expect(page).to have_css('.player', text: first_rb_name)
expect(league_on_page).to have_drafted_player(first_rb_name)

click_link 'League Home'
click_link 'Set keepers'
expect(keeper_page).to have_no_keepers

keeper_page.select_team(last_team.name)
expect(keeper_page).to have_keeper(first_rb_name, last_teams_first_pick)
keeper_page.remove_first_keeper
expect(keeper_page).to have_no_keepers
end

scenario 'can start the draft when the league is full' do
create(:draft_status, description: 'In Progress')
league = create(:football_league, user: @manager)

navigate_to_league
expect(page).to have_no_link 'Start draft'
expect(league_on_page).to have_no_link 'Start draft'
fill_league league

visit current_path
reload_page
click_link 'Start draft'
expect(page).to have_content 'Fantasy Sports Dojo Draft'
expect(league_on_page).to have_content 'Fantasy Sports Dojo Draft'
end

scenario 'can join a draft in progress' do
create(:football_league, :with_draft_in_progress, user: @manager)

navigate_to_league
expect(page).to have_link 'Join draft'
expect(league_on_page).to have_link 'Join draft'
end

scenario 'cannot start or join a completed draft' do
create(:football_league, :with_draft_complete, user: @manager)

navigate_to_league
expect(page).to have_no_link 'Start draft'
expect(page).to have_no_link 'Join draft'
expect(league_on_page).to have_no_link 'Start draft'
expect(league_on_page).to have_no_link 'Join draft'
end
end

Expand All @@ -122,6 +130,10 @@ def has_revised_draft_order?
teams_have_correct_draft_picks_set && teams_in_correct_order
end

def keeper_page
@keeper_page ||= Pages::KeeperPage.new
end

def league_on_page
@league_on_page ||= Pages::League.new
end
4 changes: 4 additions & 0 deletions spec/support/features/navigation_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ def navigate_to_league(name = 'Fantasy Sports Dojo')
click_link 'View Existing Leagues'
click_link name
end

def reload_page
visit current_path
end
end
end
39 changes: 39 additions & 0 deletions spec/support/page_objects/keeper_page.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
module Pages
class KeeperPage < Base
def has_keeper?(player_name, pick)
has_css?('.keeper', text: "#{player_name} - #{pick}")
end

def has_no_keepers?
has_no_css?('.keeper')
end

def has_selected_pick?(pick)
has_select?('pick-select', selected: pick)
end

def has_selected_player?(player_name)
has_select?('player-select', selected: player_name)
end

def has_selected_position?(position)
has_select?('position-select', selected: position)
end

def has_selected_team?(team_name)
has_select?('team-select', selected: team_name)
end

def remove_first_keeper
find('a.remove').click
end

def select_position(position)
select(position, from: 'position-select')
end

def select_team(team_name)
select(team_name, from: 'team-select')
end
end
end
4 changes: 4 additions & 0 deletions spec/support/page_objects/league.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ def enter_draft
click_link 'Join draft'
end

def has_drafted_player?(player_name)
has_css?('.player', text: player_name)
end

def has_empty_draft_results?
has_text_in_column?('round', 1) &&
has_text_in_column?('round-pick', 1) &&
Expand Down

0 comments on commit c12c7a0

Please sign in to comment.