Use helpers for repeated event dropdown links

This commit is contained in:
James Mason 2018-02-13 16:33:11 -08:00
parent 4c58104a65
commit ad19a6d753
7 changed files with 370 additions and 146 deletions

View file

@ -54,4 +54,133 @@ module EventsHelper
def rating_tooltip(event, max_rating)
"#{event.average_rating}/#{max_rating}, #{pluralize(event.voters.length, 'vote')}"
end
def event_type_dropdown(event, event_types, conference_id)
selection = event.event_type.try(:title) || 'Event Type'
options = event_types.collect do |event_type|
[
event_type.title,
admin_conference_program_event_path(
conference_id,
event,
event: { event_type_id: event_type.id }
)
]
end
active_dropdown(selection, options)
end
def track_dropdown(event, tracks, conference_id)
selection = event.track.try(:name) || 'Track'
options = tracks.collect do |track|
[
track.name,
admin_conference_program_event_path(
conference_id,
event,
event: { track_id: track.id }
)
]
end
active_dropdown(selection, options)
end
def difficulty_dropdown(event, difficulties, conference_id)
selection = event.difficulty_level.try(:title) || 'Difficulty'
options = difficulties.collect do |difficulty|
[
difficulty.title,
admin_conference_program_event_path(
conference_id,
event,
event: { difficulty_level_id: difficulty.id }
)
]
end
active_dropdown(selection, options)
end
def state_dropdown(event, conference_id, email_settings)
selection = event.state.humanize
options = []
if event.transition_possible? :accept
options << [
'Accept',
accept_admin_conference_program_event_path(conference_id, event)
]
if email_settings.send_on_accepted?
options << [
'Accept (without email)',
accept_admin_conference_program_event_path(
conference_id,
event,
send_mail: false
)
]
end
end
if event.transition_possible? :reject
options << [
'Reject',
reject_admin_conference_program_event_path(conference_id, event)
]
if email_settings.send_on_rejected?
options << [
'Reject (without email)',
reject_admin_conference_program_event_path(
conference_id,
event,
send_mail: false
)
]
end
end
if event.transition_possible? :restart
options << [
'Start review',
restart_admin_conference_program_event_path(conference_id, event)
]
end
if event.transition_possible? :confirm
options << [
'Confirm',
confirm_admin_conference_program_event_path(conference_id, event)
]
end
if event.transition_possible? :cancel
options << [
'Cancel',
cancel_admin_conference_program_event_path(conference_id, event)
]
end
active_dropdown(selection, options)
end
private
def active_dropdown(selection, options)
# Consistent rendering of dropdown lists that submit patched changes
#
# Selection is the string to show by default, which is clicked to expose the
# dropdown options.
# Options is a list of 2-item lists; for each entry:
# * [0] is the text of the option,
# * [1] is the link url for the options
content_tag('div', class: 'dropdown') do
content_tag(
'a',
class: 'dropdown-toggle',
href: '#',
data: { toggle: 'dropdown' }
) do
content_tag('span', selection) +
content_tag('span', '', class: 'caret')
end +
content_tag('ul', class: 'dropdown-menu') do
options.collect do |option|
content_tag('li', link_to(option[0], option[1], method: :patch))
end.join.html_safe
end
end
end
end

View file

@ -1,37 +0,0 @@
- if event.transition_possible? :accept
%li= link_to 'Accept event',
accept_admin_conference_program_event_path(@conference.short_title, event),
method: :patch, id: "accept_event_#{event.id}"
- if @conference.email_settings.send_on_accepted?
%li= link_to 'Accept event (without email)',
accept_admin_conference_program_event_path(@conference.short_title, event, send_mail: false),
method: :patch, hint: 'Accept this event without sending an automated email.',
id: "accept_event_without_mail_#{event.id}"
- if event.transition_possible? :reject
%li= link_to 'Reject event',
reject_admin_conference_program_event_path(@conference.short_title, event),
method: :patch, confirm: 'Are you sure?', id: "reject_event_#{event.id}"
- if @conference.email_settings.send_on_rejected?
%li= link_to 'Reject event (without email)',
reject_admin_conference_program_event_path(@conference.short_title, event, send_mail: false),
method: :patch, confirm: 'Are you sure?', id: "reject_event_without_mail_#{event.id}"
- if event.transition_possible? :restart
%li= link_to 'Start review',
restart_admin_conference_program_event_path(@conference.short_title, event),
method: :patch, id: "restart_event_#{event.id}"
- if event.transition_possible? :confirm
%li= link_to 'Confirm event',
confirm_admin_conference_program_event_path(@conference.short_title, event),
method: :patch, id: "confirm_event_#{event.id}",
hint: 'Confirm that the speaker(s) will be present and that the event will actually take place.'
- if event.transition_possible? :cancel
%li= link_to 'Cancel event',
cancel_admin_conference_program_event_path(@conference.short_title, event),
method: :patch, id: "cancel_event_#{event.id}",
hint: 'Mark this event as cancelled. Usually this means that the speakers had to cancel their appearance.'

View file

@ -16,20 +16,7 @@
%td.col-md-2
%b Type
%td
.dropdown
= link_to '#', class: 'dropdown-toggle', id: 'type-dropdown', 'data-toggle' => 'dropdown' do
- if @event.event_type.nil?
Event Type
- else
= @event.event_type.title
<b class='caret'></b>
%ul.dropdown-menu
- @event_types.each do |type|
%li= link_to type.title,
admin_conference_program_event_path(@conference.short_title,
@event,
event: { event_type_id: type.id }),
method: :patch
= event_type_dropdown(@event, @event_types, @conference.short_title)
%tr
%td
%b Highlight
@ -45,47 +32,17 @@
%td
%b State
%td
.dropdown
= link_to '#', class: 'dropdown-toggle', 'data-toggle' => 'dropdown' do
= @event.state.humanize
<b class='caret'></b>
%ul.dropdown-menu
= render 'change_state_dropdown', event: @event
= state_dropdown(@event, @conference.short_title, @conference.email_settings)
%tr
%td
%b Track
%td
.dropdown
= link_to '#', class: 'dropdown-toggle', id: 'track-dropdown', 'data-toggle' => 'dropdown' do
- if @event.track.nil?
Track
- else
= @event.track.name
<b class="caret"></b>
%ul.dropdown-menu
- @tracks.each do |track|
%li= link_to track.name,
admin_conference_program_event_path(@conference.short_title,
@event,
event: { track_id: track.id }),
method: :patch
= track_dropdown(@event, @tracks, @conference.short_title)
%tr
%td
%b Difficulty
%td
.dropdown
= link_to '#', class: 'dropdown-toggle', id: 'difficulty-dropdown', 'data-toggle' => 'dropdown' do
- if @event.difficulty_level.nil?
Difficulty Level
- else
= @event.difficulty_level.title
<b class="caret"></b>
%ul.dropdown-menu
- @difficulty_levels.each do |difficulty|
%li= link_to difficulty.title, admin_conference_program_event_path(@conference.short_title,
@event,
event: { difficulty_level_id: difficulty.id }),
method: :patch
= difficulty_dropdown(@event, @difficulty_levels, @conference.short_title)
%tr
%td
%b Requires Registration

View file

@ -152,57 +152,12 @@
off_text: 'No' }
%td
.btn-group
%button{ type: 'button', class: 'btn btn-link dropdown-toggle', 'data-toggle' => 'dropdown' }
- if event.event_type.nil?
Event Type
- else
= event.event_type.title
%span.caret
%ul.dropdown-menu
- @event_types.each do |type|
%li= link_to type.title,
admin_conference_program_event_path(@conference.short_title,
event,
event: { event_type_id: type.id }),
method: :patch
= event_type_dropdown(event, @event_types, @conference.short_title)
%td
.btn-group
%button{ type: 'button', class: 'btn btn-link dropdown-toggle', 'data-toggle' => 'dropdown' }
- if event.track.nil?
Track
- else
= event.track.name
%span.caret
%ul.dropdown-menu
- @tracks.each do |track|
%li= link_to track.name,
admin_conference_program_event_path(@conference.short_title,
event,
event: { track_id: track.id }),
method: :patch
= track_dropdown(event, @tracks, @conference.short_title)
%td
.btn-group
%button{ type: 'button', class: 'btn btn-link dropdown-toggle', 'data-toggle' => 'dropdown' }
- if event.difficulty_level.nil?
Difficulty
- else
= event.difficulty_level.title
%span.caret
%ul.dropdown-menu
- @difficulty_levels.each do |difficulty_level|
%li= link_to difficulty_level.title,
admin_conference_program_event_path(@conference.short_title,
event,
event: { difficulty_level_id: difficulty_level.id }),
method: :patch
= difficulty_dropdown(event, @difficulty_levels, @conference.short_title)
%td
.btn-group
%button{ type: 'button', class: 'btn btn-link dropdown-toggle', 'data-toggle' => 'dropdown' }
= event.state.humanize
%span.caret
%ul.dropdown-menu{ role: 'menu' }
= render 'change_state_dropdown', event: event
= state_dropdown(event, @conference.short_title, @conference.email_settings)
%td.text-center
= link_to "#{event.comments_count}", admin_conference_program_event_path(@conference.short_title, event), anchor: 'comments-div'

View file

@ -30,8 +30,8 @@ feature Event do
visit admin_conference_program_events_path(conference.short_title)
expect(page).to have_content 'Example Proposal'
click_button 'New'
click_link "reject_event_#{@event.id}"
click_on 'New'
click_link 'Reject'
expect(page).to have_content 'Event rejected!'
@event.reload
expect(@event.state).to eq('rejected')
@ -41,8 +41,8 @@ feature Event do
visit admin_conference_program_events_path(conference.short_title)
expect(page).to have_content 'Example Proposal'
click_button 'New'
click_link "accept_event_#{@event.id}"
click_on 'New'
click_link 'Accept'
expect(page).to have_content 'Event accepted!'
expect(page).to have_content 'Unconfirmed'
@event.reload
@ -54,8 +54,8 @@ feature Event do
visit admin_conference_program_events_path(conference.short_title)
expect(page).to have_content 'Example Proposal'
click_button 'Rejected'
click_link "restart_event_#{@event.id}"
click_on 'Rejected'
click_link 'Start review'
expect(page).to have_content 'Review started!'
@event.reload
expect(@event.state).to eq('new')

View file

@ -189,8 +189,8 @@ feature 'Version' do
click_button 'Update Proposal'
visit admin_conference_program_events_path(conference.short_title)
click_button 'New'
click_link 'Reject event'
click_on 'New'
click_link 'Reject'
visit conference_program_proposals_path(conference_id: conference.short_title)
within('#events') do
@ -198,15 +198,15 @@ feature 'Version' do
end
visit admin_conference_program_events_path(conference.short_title)
click_button 'New'
click_link 'Accept event'
click_on 'New'
click_link 'Accept'
visit conference_program_proposals_path(conference_id: conference.short_title)
click_link 'Confirm'
visit admin_conference_program_events_path(conference.short_title)
click_button 'Confirmed'
click_link 'Cancel event'
click_on 'Confirmed'
click_link 'Cancel'
visit admin_revision_history_path
expect(page).to have_text("#{organizer.name} submitted new event ABC in conference #{conference.short_title}")

View file

@ -2,7 +2,7 @@ require 'spec_helper'
describe EventsHelper, type: :helper do
let(:conference) { create(:conference) }
let(:event) { create(:event, program: conference.program) }
let(:event) { create(:event_full, program: conference.program) }
let(:my_vote) { 3 }
let(:max_rating) { 5 }
let(:fraction) { my_vote.to_s + '/' + max_rating.to_s }
@ -56,4 +56,224 @@ describe EventsHelper, type: :helper do
end
end
end
describe '#event_switch_checkbox' do
let(:result) do
event_switch_checkbox(event, :is_highlight, conference.short_title)
end
it 'should build a switch checkbox' do
expect(result).to include(
'<input type="checkbox"',
'class="switch-checkbox"'
)
end
it 'should patch to the admin event url' do
expect(result).to include(
'method="patch"',
"url=\"/admin/conferences/#{conference.short_title}/program" \
"/events/#{event.id}?event%5Bis_highlight%5D=\""
)
end
end
describe '#event_type_dropdown' do
let(:event_types) do
[
event.event_type,
create(:event_type, title: 'foo'),
create(:event_type, title: 'bar')
]
end
let(:result) do
event_type_dropdown(event, event_types, conference.short_title)
end
it 'builds a bootstrap dropdown list of event types' do
expect(result).to include(
'<div class="dropdown">' \
'<a class="dropdown-toggle" href="#" data-toggle="dropdown">' \
"<span>#{h event.event_type.title}</span><span class=\"caret\"></span>" \
'</a><ul class="dropdown-menu">'
)
event_types.each do |event_type|
expect(result).to include(
'<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference.short_title}/program/" \
"events/#{event.id}?event%5Bevent_type_id%5D=#{event_type.id}\">" \
"#{h event_type.title}</a></li>"
)
end
end
end
describe '#track_dropdown' do
let(:tracks) do
[
event.track,
create(:track, name: 'foo'),
create(:track, name: 'bar')
]
end
let(:result) do
track_dropdown(event, tracks, conference.short_title)
end
it 'builds a bootstrap dropdown list of tracks' do
expect(result).to include(
'<div class="dropdown">' \
'<a class="dropdown-toggle" href="#" data-toggle="dropdown">' \
"<span>#{h event.track.name}</span><span class=\"caret\"></span>" \
'</a><ul class="dropdown-menu">'
)
tracks.each do |track|
expect(result).to include(
'<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference.short_title}/program/" \
"events/#{event.id}?event%5Btrack_id%5D=#{track.id}\">" \
"#{h track.name}</a></li>"
)
end
end
end
describe '#difficulty_dropdown' do
let(:difficulties) do
[
event.difficulty_level,
create(:difficulty_level, title: 'foo'),
create(:difficulty_level, title: 'bar')
]
end
let(:result) do
difficulty_dropdown(event, difficulties, conference.short_title)
end
it 'builds a bootstrap dropdown list of difficulty levels' do
expect(result).to include(
'<div class="dropdown">' \
'<a class="dropdown-toggle" href="#" data-toggle="dropdown">' \
"<span>#{h event.difficulty_level.title}</span>" \
'<span class="caret"></span>' \
'</a><ul class="dropdown-menu">'
)
difficulties.each do |difficulty|
expect(result).to include(
'<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference.short_title}/program/" \
"events/#{event.id}?event%5Bdifficulty_level_id%5D=#{difficulty.id}\">" \
"#{h difficulty.title}</a></li>"
)
end
end
end
describe '#state_dropdown' do
let(:conference_id) { conference.short_title }
let(:email_settings) { conference.email_settings }
setup do
allow(event).to receive(:transition_possible?).at_least(:once) { false }
end
it 'builds a bootstrap dropdown list of event states' do
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(
'<div class="dropdown">' \
'<a class="dropdown-toggle" href="#" data-toggle="dropdown">' \
"<span>#{h event.state.humanize}</span><span class=\"caret\"></span>" \
'</a><ul class="dropdown-menu">'
)
end
it 'handles the accept transition' do
tag = '<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference_id}/program/" \
"events/#{event.id}/accept\">" \
'Accept</a></li>'
result = state_dropdown(event, conference_id, email_settings)
expect(result).not_to include(tag)
expect(event).to receive(:transition_possible?).with(:accept) { true }
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(tag)
end
it 'handles the accept transition without email' do
expect(event).to receive(:transition_possible?).with(:accept) { true }
expect(email_settings).to receive(:send_on_accepted?) { true }
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(
'<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference_id}/program/" \
"events/#{event.id}/accept?send_mail=false\">" \
'Accept (without email)</a></li>'
)
end
it 'handles the reject transition' do
tag = '<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference_id}/program/" \
"events/#{event.id}/reject\">" \
'Reject</a></li>'
result = state_dropdown(event, conference_id, email_settings)
expect(result).not_to include(tag)
expect(event).to receive(:transition_possible?).with(:reject) { true }
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(tag)
end
it 'handles the reject transition without email' do
expect(event).to receive(:transition_possible?).with(:reject) { true }
expect(email_settings).to receive(:send_on_rejected?) { true }
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(
'<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference_id}/program/" \
"events/#{event.id}/reject?send_mail=false\">" \
'Reject (without email)</a></li>'
)
end
it 'handles the restart transition' do
tag = '<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference_id}/program/" \
"events/#{event.id}/restart\">" \
'Start review</a></li>'
result = state_dropdown(event, conference_id, email_settings)
expect(result).not_to include(tag)
expect(event).to receive(:transition_possible?).with(:restart) { true }
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(tag)
end
it 'handles the confirm transition' do
tag = '<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference_id}/program/" \
"events/#{event.id}/confirm\">" \
'Confirm</a></li>'
result = state_dropdown(event, conference_id, email_settings)
expect(result).not_to include(tag)
expect(event).to receive(:transition_possible?).with(:confirm) { true }
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(tag)
end
it 'handles the cancel transition' do
tag = '<li><a rel="nofollow" data-method="patch" ' \
"href=\"/admin/conferences/#{conference_id}/program/" \
"events/#{event.id}/cancel\">" \
'Cancel</a></li>'
result = state_dropdown(event, conference_id, email_settings)
expect(result).not_to include(tag)
expect(event).to receive(:transition_possible?).with(:cancel) { true }
result = state_dropdown(event, conference_id, email_settings)
expect(result).to include(tag)
end
end
end