diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 019fef99..3d6e70c4 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -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 diff --git a/app/views/admin/events/_change_state_dropdown.html.haml b/app/views/admin/events/_change_state_dropdown.html.haml deleted file mode 100644 index f8dde305..00000000 --- a/app/views/admin/events/_change_state_dropdown.html.haml +++ /dev/null @@ -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.' diff --git a/app/views/admin/events/_proposal.html.haml b/app/views/admin/events/_proposal.html.haml index 4ae1676f..78d6ee02 100644 --- a/app/views/admin/events/_proposal.html.haml +++ b/app/views/admin/events/_proposal.html.haml @@ -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 - - %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 - - %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 - - %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 - - %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 diff --git a/app/views/admin/events/index.html.haml b/app/views/admin/events/index.html.haml index 304bc726..ce77a709 100644 --- a/app/views/admin/events/index.html.haml +++ b/app/views/admin/events/index.html.haml @@ -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' diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 9dda06bf..bef01e43 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -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') diff --git a/spec/features/versions_spec.rb b/spec/features/versions_spec.rb index 62536019..2f71d519 100644 --- a/spec/features/versions_spec.rb +++ b/spec/features/versions_spec.rb @@ -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}") diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb index 99f6d8e3..baefebbc 100644 --- a/spec/helpers/events_helper_spec.rb +++ b/spec/helpers/events_helper_spec.rb @@ -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( + '' \ + '' \ + "#{h event.event_type.title}" \ + '