diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index e4754e1e..a2da958f 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -714,3 +714,6 @@ Style/TrailingCommaInLiteral: - 'Guardfile' - 'db/migrate/20140701123203_add_events_per_week_to_conference.rb' - 'spec/models/conference_spec.rb' + +Style/FrozenStringLiteralComment: + Enabled: false diff --git a/app/assets/stylesheets/osem-rating.scss b/app/assets/stylesheets/osem-rating.scss index 7312ac45..f686fbe2 100644 --- a/app/assets/stylesheets/osem-rating.scss +++ b/app/assets/stylesheets/osem-rating.scss @@ -1,19 +1,16 @@ /* Styling for voting on proposals*/ -.myrating.bright { background-image: image-url("star-bright.png"); } -.myrating.glow { background-image: image-url("star-glow.png"); } -.othersrating.bright { background-image: image-url("star-bright.png"); } -.avgrating.bright { background-image: image-url("star-bright.png"); } -.avgrating { +.rating { background: image-url("star.png") 0 0; - margin-right: -2px; width: 24px; height: 24px; display: inline-block; -} -.myrating, .othersrating { - background: image-url("star.png") 0 0; - width: 24px; - height: 24px; float: left; -} + &.bright { + background-image: image-url("star-bright.png"); + } + + &.glow { + background-image: image-url("star-glow.png"); + } +} diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb index 164e0407..373c91b3 100644 --- a/app/controllers/admin/events_controller.rb +++ b/app/controllers/admin/events_controller.rb @@ -25,6 +25,7 @@ module Admin @scheduled_event_distribution = @conference.scheduled_event_distribution @file_name = "events_for_#{@conference.short_title}" @event_export_option = params[:event_export_option] + @export_formats = [:pdf, :csv, :xlsx] respond_to do |format| format.html @@ -46,7 +47,7 @@ module Admin @event_types = @program.event_types @comments = @event.root_comments @comment_count = @event.comment_threads.count - @ratings = @event.votes.includes(:user) + @votes = @event.votes.includes(:user) @difficulty_levels = @program.difficulty_levels @versions = @event.versions | PaperTrail::Version.where(item_type: 'Commercial').where('object LIKE ?', "%commercialable_id: #{@event.id}\ncommercialable_type: Event%") | @@ -146,7 +147,7 @@ module Admin end def vote - @ratings = @event.votes.includes(:user) + @votes = @event.votes.includes(:user) if (votes = current_user.votes.find_by_event_id(params[:id])) votes.update_attributes(rating: params[:rating]) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f0311c7a..c334cde2 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -154,7 +154,7 @@ module ApplicationHelper end def rescheduling_hint(affected_event_count) - if affected_event_count > 0 + if affected_event_count.positive? "You have #{affected_event_count} scheduled #{'event'.pluralize(affected_event_count)}. Changing the conference hours will unschedule those scheduled outside the conference hours." end end @@ -196,4 +196,23 @@ module ApplicationHelper object.picture.large.url end end + + def rating_stars(rating, max, options = {}) + Array.new(max) do |counter| + content_tag( + 'label', + '', + class: "rating#{' bright' if rating.to_f > counter}", + **options + ) + end.join.html_safe + end + + def rating_fraction(rating, max, options = {}) + content_tag( + 'span', + "#{rating}/#{max}", + **options + ) + end` end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 8f620e62..6e95ff1d 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -10,18 +10,6 @@ module EventsHelper "Registered: #{event.registrations.count}" end - ## - # Checks if the voting has already started, or if it has already ended - # - def voting_open_or_close(program) - return if program.voting_period? - if program.voting_start_date > Time.current - return 'Voting period has not started yet!' - else # voting_end_date > Date.today because voting_start_date < voting_end_date - return 'Voting period is over!' - end - end - def replacement_event_notice(event_schedule) if event_schedule.present? && event_schedule.replacement? replaced_event = (event_schedule.intersecting_event_schedules.withdrawn.first || event_schedule.intersecting_event_schedules.canceled.first).event @@ -47,4 +35,160 @@ module EventsHelper include_blank: '(Please select)' end end + + 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 + + def event_switch_checkbox(event, attribute, conference_id) + check_box_tag( + conference_id, + event.id, + event.send(attribute), + url: admin_conference_program_event_path( + conference_id, + event, + event: { attribute => nil } + ), + method: :patch, + class: 'switch-checkbox', + data: { + size: 'small', + off_color: 'warning', + on_text: 'Yes', + off_text: 'No' + } + ) + 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/models/ability.rb b/app/models/ability.rb index d6b3ef21..c3726f9d 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -18,7 +18,7 @@ class Ability can [:index, :conferences], Organization can [:index], Conference can [:show], Conference do |conference| - conference.splashpage && conference.splashpage.public == true + conference&.splashpage&.public end # Can view the schedule can [:schedule, :events], Conference do |conference| diff --git a/app/models/cfp.rb b/app/models/cfp.rb index 5105a6bd..02e74abb 100644 --- a/app/models/cfp.rb +++ b/app/models/cfp.rb @@ -42,7 +42,7 @@ class Cfp < ApplicationRecord def weeks result = end_week - start_week + 1 weeks = Date.new(start_date.year, 12, 31).strftime('%W').to_i - result < 0 ? result + weeks : result + result.negative? ? result + weeks : result end ## @@ -63,7 +63,7 @@ class Cfp < ApplicationRecord def remaining_days(date = Date.today) result = (end_date - date).to_i - result > 0 ? result : 0 + result.positive? ? result : 0 end ## @@ -106,12 +106,12 @@ class Cfp < ApplicationRecord private def before_end_of_conference - if program && program.conference && program.conference.end_date && end_date && (end_date > program.conference.end_date) + if program&.conference && program.conference.end_date && end_date && (end_date > program.conference.end_date) errors .add(:end_date, "can't be after the conference end date (#{program.conference.end_date})") end - if program && program.conference && program.conference.end_date && start_date && (start_date > program.conference.end_date) + if program&.conference && program.conference.end_date && start_date && (start_date > program.conference.end_date) errors .add(:start_date, "can't be after the conference end date (#{program.conference.end_date})") end diff --git a/app/models/conference.rb b/app/models/conference.rb index 81e9ec32..f757bfe9 100644 --- a/app/models/conference.rb +++ b/app/models/conference.rb @@ -102,7 +102,7 @@ class Conference < ApplicationRecord # * +false+ -> If the user is registered # * +true+ - If the user isn't registered def user_registered? user - user.present? && registrations.where(user_id: user.id).count > 0 + user.present? && registrations.where(user_id: user.id).count.positive? end ## @@ -113,7 +113,7 @@ class Conference < ApplicationRecord event_schedules = program.event_schedules.select do |event_schedule| event_schedule.start_time.hour < start_hour || event_schedule.end_time.hour > end_hour || - (event_schedule.end_time.hour == end_hour && event_schedule.end_time.minute > 0) + (event_schedule.end_time.hour == end_hour && event_schedule.end_time.minute.positive?) end event_schedules.each(&:destroy) end @@ -151,7 +151,7 @@ class Conference < ApplicationRecord def get_submissions_per_week result = [] - if program && program.cfp && program.events + if program&.cfp && program.events submissions = program.events.select(:week).group(:week).order(:week).count start_week = program.cfp.start_week weeks = program.cfp.weeks @@ -168,7 +168,7 @@ class Conference < ApplicationRecord # * +Array+ -> e.g. 'Submitted' => [0, 3, 3, 5] -> first week 0 events, second week 3 events. def get_submissions_data result = {} - if program && program.cfp && program.events + if program&.cfp && program.events result = get_events_per_week_by_state start_week = program.cfp.start_week @@ -182,7 +182,7 @@ class Conference < ApplicationRecord result[state] = pad_array_left_not_kumulative(start_week, values) end end - result['Weeks'] = weeks > 0 ? (1..weeks).to_a : 0 + result['Weeks'] = weeks.positive? ? (1..weeks).to_a : 0 end result end @@ -256,7 +256,7 @@ class Conference < ApplicationRecord result[Ticket.find(ticket).title] = pad_array_left_not_kumulative(start_week, values) end - result['Weeks'] = weeks > 0 ? (1..weeks).to_a : 0 + result['Weeks'] = weeks.positive? ? (1..weeks).to_a : 0 end result end @@ -269,15 +269,14 @@ class Conference < ApplicationRecord def registration_weeks result = 0 weeks = 0 - if registration_period && - registration_period.start_date && + if registration_period&.start_date && registration_period.end_date weeks = Date.new(registration_period.start_date.year, 12, 31) .strftime('%W').to_i result = get_registration_end_week - get_registration_start_week + 1 end - result < 0 ? result + weeks : result + result.negative? ? result + weeks : result end ## @@ -343,7 +342,7 @@ class Conference < ApplicationRecord tracks: tracks_set?, event_types: event_types_set?, difficulty_levels: difficulty_levels_set?, - splashpage: splashpage && splashpage.public? + splashpage: splashpage&.public? } result.update( @@ -449,11 +448,11 @@ class Conference < ApplicationRecord i += 1 end end - if others > 0 + if others.positive? result['Others'] = { 'value' => others, 'color' => next_color(i) } i += 1 end - result['None'] = { 'value' => none, 'color' => next_color(i) } if none > 0 + result['None'] = { 'value' => none, 'color' => next_color(i) } if none.positive? result end @@ -719,7 +718,7 @@ class Conference < ApplicationRecord # * +True+ -> If the registration limit has been reached or exceeded # * +False+ -> If the registration limit hasn't been exceeded def registration_limit_exceeded? - registration_limit > 0 && registrations.count + program.speakers.confirmed.unregistered(program.conference).count >= registration_limit + registration_limit.positive? && registrations.count + program.speakers.confirmed.unregistered(program.conference).count >= registration_limit end # Returns an hexadecimal color given a collection. The returned color changed @@ -757,7 +756,7 @@ class Conference < ApplicationRecord # * +True+ -> if accepted booths are equal to the booth limit # * +False+ -> Accepted booths have not reached the booth limit def maximum_accepted_booths? - booth_limit > 0 && booths.accepted.count + booths.confirmed.count >= booth_limit + booth_limit.positive? && booths.accepted.count + booths.confirmed.count >= booth_limit end ## @@ -829,7 +828,7 @@ class Conference < ApplicationRecord # Reports an error when such a condition is found def valid_times_range? if start_hour && end_hour - errors.add(:start_hour, 'is lower than 0') if start_hour < 0 + errors.add(:start_hour, 'is lower than 0') if start_hour.negative? errors.add(:end_hour, 'is lower or equal than start hour') if end_hour <= start_hour errors.add(:end_hour, 'is greater than 24') if end_hour > 24 end @@ -843,7 +842,7 @@ class Conference < ApplicationRecord def weeks(start_week, end_week) weeks = end_week - start_week + 1 weeks_of_year = Date.new(start_date.year, 12, 31).strftime('%W').to_i - weeks < 0 ? weeks + weeks_of_year : weeks + weeks.negative? ? weeks + weeks_of_year : weeks end ## @@ -961,7 +960,7 @@ class Conference < ApplicationRecord # * +True+ -> One difficulty level or more # * +False+ -> No diffculty level def difficulty_levels_set? - program.difficulty_levels.count > 0 + program.difficulty_levels.count.positive? end ## @@ -971,7 +970,7 @@ class Conference < ApplicationRecord # * +True+ -> One difficulty level or more # * +False+ -> No diffculty level def event_types_set? - program.event_types.count > 0 + program.event_types.count.positive? end ## @@ -981,7 +980,7 @@ class Conference < ApplicationRecord # * +True+ -> One track or more # * +False+ -> No track def tracks_set? - program.tracks.count > 0 + program.tracks.count.positive? end ## @@ -991,7 +990,7 @@ class Conference < ApplicationRecord # * +True+ -> One room or more # * +False+ -> No room def rooms_set? - venue.present? && venue.rooms.count > 0 + venue.present? && venue.rooms.count.positive? end # Checks if the conference has a venue object. @@ -1097,19 +1096,19 @@ class Conference < ApplicationRecord # * +hash+ -> hash def self.calculate_user_distribution_hash(active_user, unconfirmed_user, dead_user) result = {} - if active_user > 0 + if active_user.positive? result['Active'] = { 'color' => 'green', 'value' => active_user } end - if unconfirmed_user > 0 + if unconfirmed_user.positive? result['Unconfirmed'] = { 'color' => 'red', 'value' => unconfirmed_user } end - if dead_user > 0 + if dead_user.positive? result['Dead'] = { 'color' => 'black', 'value' => dead_user diff --git a/app/models/event.rb b/app/models/event.rb index 943572eb..c0361868 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -120,7 +120,15 @@ class Event < ApplicationRecord @total_rating += vote.rating end @total = votes.size - @total_rating > 0 ? number_with_precision(@total_rating / @total.to_f, precision: 2, strip_insignificant_zeros: true) : 0 + if @total_rating.positive? + number_with_precision( + @total_rating / @total.to_f, + precision: 2, + strip_insignificant_zeros: true + ) + else + 0 + end end # get event speakers with the event sumbmitter at the first position @@ -310,7 +318,7 @@ class Event < ApplicationRecord def before_end_of_conference errors - .add(:created_at, "can't be after the conference end date!") if program.conference && program.conference.end_date && + .add(:created_at, "can't be after the conference end date!") if program.conference&.end_date && (Date.today > program.conference.end_date) end @@ -322,7 +330,7 @@ class Event < ApplicationRecord # Allow only confirmed tracks that belong to the same program as the event # def valid_track - return unless track && track.program && program + return unless track&.program && program errors.add(:track, 'is invalid') unless track.confirmed? && track.program == program end diff --git a/app/models/program.rb b/app/models/program.rb index 14554786..a6c7aff3 100644 --- a/app/models/program.rb +++ b/app/models/program.rb @@ -80,7 +80,7 @@ class Program < ApplicationRecord tracks.self_organized.confirmed.order(start_date: :asc).each do |track| event_schedules += track.selected_schedule.event_schedules.order(start_time: :asc) if track.selected_schedule end - event_schedules.sort_by(&:start_time) if event_schedules + event_schedules&.sort_by(&:start_time) end ## @@ -134,7 +134,7 @@ class Program < ApplicationRecord # * +false+ -> If rating is not enabled # * +true+ -> If rating is enabled def rating_enabled? - rating && rating > 0 + rating&.positive? end ## @@ -240,7 +240,9 @@ class Program < ApplicationRecord # Check if schedule_interval is a divisor of 60 minutes # def schedule_interval_divisor_60 - errors.add(:schedule_interval, 'must be a divisor of 60') if schedule_interval > 0 && 60 % schedule_interval > 0 + if schedule_interval.positive? && 60 % schedule_interval.positive? + errors.add(:schedule_interval, 'must be a divisor of 60') + end end ## @@ -248,7 +250,7 @@ class Program < ApplicationRecord # def unschedule_unfit_events unfit_schedules = event_schedules.select do |event_schedule| - event_schedule.start_time.min % schedule_interval > 0 + event_schedule.start_time.min % schedule_interval.positive? end EventSchedule.where(id: unfit_schedules.map(&:id)).destroy_all end diff --git a/app/models/registration.rb b/app/models/registration.rb index 45d2d55b..536392dc 100644 --- a/app/models/registration.rb +++ b/app/models/registration.rb @@ -77,7 +77,8 @@ class Registration < ApplicationRecord end def registration_limit_not_exceed - if conference.registration_limit > 0 && conference.registrations(:reload).count >= conference.registration_limit + if conference.registration_limit.positive? && + conference.registrations(:reload).count >= conference.registration_limit errors.add(:base, 'Registration limit exceeded') end end diff --git a/app/models/registration_period.rb b/app/models/registration_period.rb index 9aa82444..dadb1ae1 100644 --- a/app/models/registration_period.rb +++ b/app/models/registration_period.rb @@ -11,10 +11,10 @@ class RegistrationPeriod < ApplicationRecord def before_end_of_conference errors - .add(:start_date, "can't be after the conference end date (#{conference.end_date})") if conference && conference.end_date && start_date && (start_date > conference.end_date) + .add(:start_date, "can't be after the conference end date (#{conference.end_date})") if conference&.end_date && start_date && (start_date > conference.end_date) errors - .add(:end_date, "can't be after the conference end date (#{conference.end_date})") if conference && conference.end_date && end_date && (end_date > conference.end_date) + .add(:end_date, "can't be after the conference end date (#{conference.end_date})") if conference&.end_date && end_date && (end_date > conference.end_date) end def start_date_before_end_date diff --git a/app/models/ticket_purchase.rb b/app/models/ticket_purchase.rb index 15de3785..2c63fc85 100644 --- a/app/models/ticket_purchase.rb +++ b/app/models/ticket_purchase.rb @@ -48,7 +48,7 @@ class TicketPurchase < ApplicationRecord end def self.purchase_ticket(conference, quantity, ticket, user) - if quantity > 0 + if quantity.positive? purchase = new(ticket_id: ticket.id, conference_id: conference.id, user_id: user.id, @@ -65,7 +65,7 @@ class TicketPurchase < ApplicationRecord user_id: user.id, paid: false).first - purchase.quantity = quantity if quantity > 0 + purchase.quantity = quantity if quantity.positive? purchase end diff --git a/app/models/track.rb b/app/models/track.rb index 01755c0e..b53d7944 100644 --- a/app/models/track.rb +++ b/app/models/track.rb @@ -113,10 +113,8 @@ class Track < ApplicationRecord def revoke_role_and_cleanup role = Role.find_by(name: 'track_organizer', resource: self) - if role - role.users.each do |user| - user.remove_role 'track_organizer', self - end + role&.users&.each do |user| + user.remove_role 'track_organizer', self end self.selected_schedule_id = nil diff --git a/app/models/user.rb b/app/models/user.rb index d062529a..a7a279c5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -126,7 +126,7 @@ class User < ApplicationRecord def self.for_ichain_username(username, attributes) user = find_by(username: username) - raise UserDisabled if user && user.is_disabled + raise UserDisabled if user&.is_disabled if user user.update_attributes(email: attributes[:email], diff --git a/app/models/venue.rb b/app/models/venue.rb index 6a758242..9ef8b109 100644 --- a/app/models/venue.rb +++ b/app/models/venue.rb @@ -19,7 +19,7 @@ class Venue < ApplicationRecord def country_name name = ISO3166::Country[country] - name.name if name + name&.name end def location? 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/_datatable_row.haml b/app/views/admin/events/_datatable_row.haml new file mode 100644 index 00000000..4f361338 --- /dev/null +++ b/app/views/admin/events/_datatable_row.haml @@ -0,0 +1,64 @@ +- cache ['admin/events/index', conference_id, event, event.submitter, + event.speakers, event_types, tracks, difficulty_levels] do + %tr{ id: "event-#{event.id}" } + %td + = event.id + + %td + = link_to event.title, + admin_conference_program_event_path(conference_id, event) + + - if rating_enabled + %td.col-md-1{ data: { order: event.average_rating } } + = render 'datatable_row_rating', + event: event, + show_votes: show_votes, + max_rating: max_rating + + - if event.submitter + %td + = link_to event.submitter.name, admin_user_path(event.submitter) + - unless event.submitter.registrations.for_conference(event.conference) + %span.label.label-warning Unregistered + - else + %td.bg-danger + Unknown submitter + + %td + - event.speakers_ordered.each do |speaker| + .speaker + = link_to speaker.name, admin_user_path(speaker) + - unless speaker.registrations.for_conference(event.conference) + %span.label.label-danger Unregistered + + - if @program.languages.present? + %td + = event.language + + %td.text-center{ data: { order: event.require_registration.to_s } } + = event_switch_checkbox(event, :require_registration, conference_id) + - if event.require_registration + = link_to registered_text(event), + registrations_admin_conference_program_event_path(conference_id, + event), + class: 'btn btn-xs btn-default' + + %td.text-center{ data: { order: event.is_highlight.to_s } } + = event_switch_checkbox(event, :is_highlight, conference_id) + + %td + = event_type_dropdown(event, event_types, conference_id) + + %td + = track_dropdown(event, tracks, conference_id) + + %td + = difficulty_dropdown(event, difficulty_levels, conference_id) + + %td + = state_dropdown(event, conference_id, email_settings) + + %td.text-center + = link_to "#{event.comments_count}", + admin_conference_program_event_path(conference_id, event), + anchor: 'comments-div' diff --git a/app/views/admin/events/_datatable_row_rating.haml b/app/views/admin/events/_datatable_row_rating.haml new file mode 100644 index 00000000..8e3e9c29 --- /dev/null +++ b/app/views/admin/events/_datatable_row_rating.haml @@ -0,0 +1,12 @@ +- if show_votes + %div{ data: { toggle: 'tooltip' }, title: rating_tooltip(event, max_rating) }< + = rating_stars(event.average_rating, max_rating, avgrate: true) + +.clearfix + - if event.voted?(current_user) + %span.label.label-success + You voted: + = rating_fraction(event.user_rating(current_user), max_rating) + - else + %span.label.label-danger + Not rated diff --git a/app/views/admin/events/_export_menu.haml b/app/views/admin/events/_export_menu.haml new file mode 100644 index 00000000..e7743d23 --- /dev/null +++ b/app/views/admin/events/_export_menu.haml @@ -0,0 +1,21 @@ +.btn-group + %button.btn.btn-success.dropdown-toggle{ data: { toggle: 'dropdown' } } + Export + = export_format.upcase + %span.caret + %ul.dropdown-menu{ role: 'menu' } + %li + = link_to 'All Events', + admin_conference_program_events_path(conference_id, + format: export_format, + event_export_option: 'all') + %li + = link_to 'Confirmed Events', + admin_conference_program_events_path(conference_id, + format: export_format, + event_export_option: 'confirmed') + %li + = link_to 'All Events with Comments', + admin_conference_program_events_path(conference_id, + format: export_format, + event_export_option: 'all_with_comments') diff --git a/app/views/admin/events/_proposal.html.haml b/app/views/admin/events/_proposal.html.haml index 063bb20a..254f4071 100644 --- a/app/views/admin/events/_proposal.html.haml +++ b/app/views/admin/events/_proposal.html.haml @@ -1,188 +1,136 @@ -.row - .col-md-12 - %h3 - = @event.title - %br - %small - = @event.subtitle - .btn-group.pull-right - = link_to 'Registrations', registrations_admin_conference_program_event_path(@conference.short_title, @event), class: 'btn btn-success' - = link_to 'Edit', edit_admin_conference_program_event_path(@conference.short_title, @event), class: 'btn btn-mini btn-primary' +- cache ['admin/event', @conference, @event, @event_types, @tracks, @difficulty_levels] do + .row + .col-md-12 + %h3 + = @event.title + %br + %small + = @event.subtitle + .btn-group.pull-right + = link_to 'Registrations', registrations_admin_conference_program_event_path(@conference.short_title, @event), class: 'btn btn-success' + = link_to 'Edit', edit_admin_conference_program_event_path(@conference.short_title, @event), class: 'btn btn-mini btn-primary' -.row - .col-md-12 - %table.table - %tr - %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 - %tr - %td - %b Highlight - %td - = check_box_tag @conference.short_title, @event.id, @event.is_highlight, - method: :patch, url: "/admin/conferences/#{@conference.short_title}/program/events/#{@event.id}?event[is_highlight]=", - class: 'switch-checkbox', data: { size: 'small', - off_color: 'warning', - on_text: 'Yes', - off_text: 'No' } - - %tr - %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 - %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 - %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 - %tr - %td - %b Requires Registration - %td - = check_box_tag @conference.short_title, @event.id, @event.require_registration, - method: :patch, url: "/admin/conferences/#{@conference.short_title}/program/events/#{@event.id}?event[require_registration]=", - class: 'switch-checkbox', data: { size: 'small', - off_color: 'warning', - on_text: 'Yes', - off_text: 'No' } - - if @event.require_registration - = registered_text(@event) - - - if @program.languages.present? + .row + .col-md-12 + %table.table + %tr + %td.col-md-2 + %b Type + %td + = event_type_dropdown(@event, @event_types, @conference.short_title) %tr %td - %b Language + %b Highlight %td - = @event.language + = event_switch_checkbox(@event, :is_highlight, @conference.short_title) + %tr + %td + %b State + %td + = state_dropdown(@event, @conference.short_title, @conference.email_settings) + %tr + %td + %b Track + %td + = track_dropdown(@event, @tracks, @conference.short_title) + %tr + %td + %b Difficulty + %td + = difficulty_dropdown(@event, @difficulty_levels, @conference.short_title) + %tr + %td + %b Requires Registration + %td + = event_switch_checkbox(@event, :require_registration, @conference.short_title) + - if @event.require_registration + = registered_text(@event) - - unless @event.room.nil? + - if @program.languages.present? + %tr + %td + %b Language + %td + = @event.language + + - unless @event.room.nil? + %tr + %td + %b Room + %td + = @event.room.name + - unless @event.time.nil? + %tr + %td + %b Scheduled time + %td + = time_with_timezone(@event.time) %tr %td - %b Room + %b Submitter %td - = @event.room.name - - unless @event.time.nil? - %tr - %td - %b Scheduled time - %td - = time_with_timezone(@event.time) - %tr - %td - %b Submitter - %td - - if @program.show_voting? = link_to @event.submitter.name, admin_user_path(@event.submitter) ( = link_to @event.submitter.email, "mailto: #{@event.submitter.email}" ) - - else - %i Hidden - %tr - %td - %b Speakers - %td - - if @program.show_voting? + %tr + %td + %b Speakers + %td - @event.speakers.each do |speaker| %div = link_to speaker.name, admin_user_path(speaker) ( = link_to speaker.email, "mailto: #{speaker.email}" ) - - else - %i Hidden - %tr - %td - %b Biographies - %td - - @event.speakers.each do |speaker| - - unless speaker.biography.blank? - %b - = speaker.name - = markdown(speaker.biography) - %tr - %td - %b Submitted on - %td= @event.created_at - %tr - %td - %b Last updated on - %td= @event.updated_at - %tr - %td - %b Abstract - %td= markdown(@event.abstract) - %tr - %td - %b Requirements - %td= simple_format(@event.description) + %tr + %td + %b Biographies + %td + - @event.speakers.each do |speaker| + - unless speaker.biography.blank? + %b + = speaker.name + = markdown(speaker.biography) + %tr + %td + %b Submitted on + %td= @event.created_at + %tr + %td + %b Last updated on + %td= @event.updated_at + %tr + %td + %b Abstract + %td= markdown(@event.abstract) + %tr + %td + %b Requirements + %td= simple_format(@event.description) - - if @conference.program && @conference.program.rating && @conference.program.rating > 0 - = render partial: 'voting' + - if @conference.program.rating_enabled? + = render 'voting', + event: @event, + show_votes: @program.show_voting?, + max_rating: @program.rating, + voting_period: @program.voting_period?, + votes: @votes, + conference_id: @conference.short_title -.row - = link_to "Comments (#{@comment_count})", '#', id: 'event-comment-link' - #comments-div - %hr - %ul.media - %div - .row-fluid - = semantic_form_for :comment, url: comment_admin_conference_program_event_path(@conference.short_title, @event.id), method: :post do |f| - = f.input :body - = f.submit 'Add Comment', class: 'btn btn-primary pull-right' - %br - %br - - @comments.each do |comment| - %div - = render partial: 'nested_comments', locals: { comment: comment, padding: 0} +- cache [@conference, @event, @comments] do + .row + = link_to "Comments (#{@comment_count})", '#', id: 'event-comment-link' + #comments-div + %hr + %ul.media + %div + .row-fluid + = semantic_form_for :comment, url: comment_admin_conference_program_event_path(@conference.short_title, @event.id), method: :post do |f| + = f.input :body + = f.submit 'Add Comment', class: 'btn btn-primary pull-right' + %br + %br + - @comments.each do |comment| + %div + = render partial: 'nested_comments', locals: { comment: comment, padding: 0} diff --git a/app/views/admin/events/_voting.html.haml b/app/views/admin/events/_voting.html.haml index b7ae8ee2..8a8fa4ed 100644 --- a/app/views/admin/events/_voting.html.haml +++ b/app/views/admin/events/_voting.html.haml @@ -1,70 +1,56 @@ %table.table#myrating - - if @program.show_voting? + - if show_votes %tr %td.col-md-2 %b Rating %td - - if @event.average_rating.to_f > 0 - #{@event.average_rating}/#{@program.rating} - - else - Rating: 0/#{@program.rating} - - - @program.rating.times do |counter| - - if @event.average_rating.to_f.round == counter + 1 - = label_tag 'label_rating', '', class: 'avgrating', avgrate: true - = javascript_tag "$('label[avgrate=true]').prevAll().andSelf().addClass('bright');" - - else - = label_tag 'label_rating', '', class: 'avgrating' + #{event.average_rating}/#{max_rating} + = rating_stars(event.average_rating, max_rating, avgrate: true ) %tr %td %b Voters %td - = @event.voters.length - - if @event.voters.length > 0 + = votes.length + - unless votes.blank? ( - = @ratings.map {|x| "#{x.name}"}.join ', ' + = votes.collect(&:name).to_sentence ) %tr %td.col-md-2 %b Your vote %td - - if @program.voting_period? - - @program.rating.times do |counter| - - if @event.voted?(current_user) && @event.user_rating(current_user) == counter + 1 - = link_to '', vote_admin_conference_program_event_path(@conference.short_title, @event, rating: counter + 1), remote: true, id: "label#{counter + 1}", class: 'myrating', voted: true + - if voting_period + - max_rating.times do |counter| + - if event.user_rating(current_user) > counter + = link_to '', + vote_admin_conference_program_event_path(conference_id, + event, rating: counter + 1), + remote: true, + id: "label#{counter + 1}", + class: 'rating myrating bright', + voted: true - else - = link_to '', vote_admin_conference_program_event_path(@conference.short_title, @event, rating: counter + 1), remote: true, id: "label#{counter + 1}", class: 'myrating' - %br + = link_to '', + vote_admin_conference_program_event_path(conference_id, + event, rating: counter + 1), + remote: true, + id: "label#{counter + 1}", + class: 'rating myrating' - else - - @conference.program.rating.times do |counter| - - if @event.voted?(current_user) && @event.user_rating(current_user) == counter + 1 - = label_tag "label#{counter + 1}", '', class: 'othersrating', voted: true - = javascript_tag "$('label[voted=true]').prevAll().andSelf().addClass('bright');" - - else - = label_tag "label#{counter + 1}", '', class: 'othersrating' - (#{voting_open_or_close(@program)}) + = rating_stars(event.user_rating(current_user), max_rating, voted: true) + = (Voting period is closed) - - if @program.show_voting? - - if @ratings.length > 0 - - @ratings.each do |rate| - - unless rate.user_id == current_user.id + - if show_votes + - unless votes.blank? + - votes.each do |vote| + - unless vote.user_id == current_user.id %tr %td - = rate.name + = vote.name %td - - @conference.program.rating.times do |counter| + = rating_stars(vote, max_rating ) - - if @event.voted?(rate.user) && @event.user_rating(rate.user) == counter + 1 - = label_tag "label#{counter + 1}", "", class: 'othersrating', voted: true - = javascript_tag "$('label[voted=true]').prevAll().andSelf().addClass('bright');" - - else - = label_tag "label#{counter + 1}", "", class: 'othersrating' :javascript - $(function () { - var checkedId = $("a[voted='true']").attr('id'); - $('a[id=' + checkedId + ']').prevAll().andSelf().addClass('bright'); - }); - $(".myrating").hover( function() { // mouseover $(this).prevAll().andSelf().addClass('glow'); diff --git a/app/views/admin/events/_voting_index.html.haml b/app/views/admin/events/_voting_index.html.haml deleted file mode 100644 index 18a9e73b..00000000 --- a/app/views/admin/events/_voting_index.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -- if @program.show_voting? - #{event.average_rating}/#{@program.rating} - %br - #{pluralize(event.voters.length, 'voter')} - %br - - @program.rating.times do |counter| - - if event.average_rating.to_f.round == counter + 1 - = label_tag 'label_rating', '', class: 'avgrating', avgrate: true - = javascript_tag "$('label[avgrate=true]').prevAll().andSelf().addClass('bright');" - - else - = label_tag 'label_rating', '', class: 'avgrating' - %br - -- if event.voted?(current_user) - %span.label.label-success - Your rating: #{ event.user_rating(current_user) } -- else - %span.label.label-danger - Not rated diff --git a/app/views/admin/events/index.html.haml b/app/views/admin/events/index.html.haml index be7abe05..3088539c 100644 --- a/app/views/admin/events/index.html.haml +++ b/app/views/admin/events/index.html.haml @@ -6,37 +6,20 @@ = "(#{@events.length})" if @events.any? .btn-group.pull-right - %button.btn.btn-primary{ 'data-toggle' => 'modal', 'data-target' => '#mass-commercials-modal', title: 'Mass import of commercials for events' } + %button.btn.btn-primary{ title: 'Mass import of commercials for events', + data: { toggle: 'modal', target: '#mass-commercials-modal' } } Add Commercials - if can? :create, Event - = link_to 'Add Event', new_admin_conference_program_event_path(@conference.short_title), class: 'button btn btn-default btn-info' + = link_to 'Add Event', + new_admin_conference_program_event_path(@conference.short_title), + class: 'button btn btn-default btn-info' - if can? :read, Event - .btn-group - %button.btn.btn-default.dropdown-toggle{ 'data-toggle' => 'dropdown', type: 'button', class: 'btn btn-success' } - Export PDF - %span.caret - %ul.dropdown-menu{ role: 'menu' } - %li= link_to 'All Events', admin_conference_program_events_path(@conference.short_title, format: :pdf, event_export_option: 'all') - %li= link_to 'Confirmed Events', admin_conference_program_events_path(@conference.short_title, format: :pdf, event_export_option: 'confirmed') - %li= link_to 'All Events with Comments', admin_conference_program_events_path(@conference.short_title, format: :pdf, event_export_option: 'all_with_comments') - .btn-group - %button.btn.btn-default.dropdown-toggle{ 'data-toggle' => 'dropdown', type: 'button', class: 'btn btn-success' } - Export CSV - %span.caret - %ul.dropdown-menu{ role: 'menu' } - %li= link_to 'All', admin_conference_program_events_path(@conference.short_title, format: :csv, event_export_option: 'all') - %li= link_to 'Confirmed', admin_conference_program_events_path(@conference.short_title, format: :csv, event_export_option: 'confirmed') - %li= link_to 'All with Comments', admin_conference_program_events_path(@conference.short_title, format: :csv, event_export_option: 'all_with_comments') - .btn-group - %button.btn.btn-default.dropdown-toggle{ 'data-toggle' => 'dropdown', type: 'button', class: 'btn btn-success' } - Export XLS - %span.caret - %ul.dropdown-menu{ role: 'menu' } - %li= link_to 'All', admin_conference_program_events_path(@conference.short_title, format: :xlsx, event_export_option: 'all') - %li= link_to 'Confirmed', admin_conference_program_events_path(@conference.short_title, format: :xlsx, event_export_option: 'confirmed') - %li= link_to 'All with Comments', admin_conference_program_events_path(@conference.short_title, format: :xlsx, event_export_option: 'all_with_comments') + - @export_formats.each do |export_format| + = render 'export_menu', + export_format: export_format, + conference_id: @conference.short_title %p.text-muted All the submissions of your speakers @@ -54,17 +37,25 @@ %b 11:https://youtube.com/myvideo .modal-body - = semantic_form_for '', url: mass_upload_commercials_admin_conference_program_path(@conference.short_title), method: :post do |f| + = semantic_form_for '', + url: mass_upload_commercials_admin_conference_program_path(@conference.short_title), + method: :post do |f| = f.input 'file', as: :file .modal-footer = f.submit 'Add', class: 'btn btn-primary' .row .col-md-4 - = render partial: 'admin/conferences/doughnut_chart', locals: { title: 'Events state', data: @event_distribution } + = render 'admin/conferences/doughnut_chart', + title: 'Events state', + data: @event_distribution .col-md-4 - = render partial: 'admin/conferences/doughnut_chart', locals: { title: 'Confirmed events scheduled', data: @scheduled_event_distribution } + = render 'admin/conferences/doughnut_chart', + title: 'Confirmed events scheduled', + data: @scheduled_event_distribution .col-md-4 - = render partial: 'admin/conferences/doughnut_chart', locals: { title: 'Tracks of confirmed events', data: @tracks_distribution_confirmed } + = render 'admin/conferences/doughnut_chart', + title: 'Tracks of confirmed events', + data: @tracks_distribution_confirmed .row .col-md-12 .margin-event-table @@ -81,7 +72,7 @@ %b Submitter %th %b Speakers - -if @program.languages.present? + - if @program.languages.present? %th %b Language %th @@ -99,113 +90,14 @@ %th .fa.fa-comment - @events.each do |event| - %tr - %td - = event.id - %td - = link_to event.title, admin_conference_program_event_path(@conference.short_title, event) - - - if @program.rating_enabled? - %td.col-md-1{ 'data-order' => "#{event.average_rating}" } - = render partial: 'voting_index', locals: { event: event } - - - if event.submitter && event.submitter.registrations && event.submitter.registrations.count < 1 - - bgcolor = '#F7819F' - - else - - bgcolor = '' - %td{ style: "background-color: #{bgcolor}" } - - if @program.show_voting? - - unless event.submitter.nil? - = link_to event.submitter.name, admin_user_path(event.submitter) - - if event.submitter.registrations.count < 1 - (Unregistered!) - - else - Unknown submitter - - else - %i Hidden - %td - - if @program.show_voting? - - event.speakers_ordered.each do |speaker| - .speaker - = link_to speaker.name, admin_user_path(speaker) - - else - %i Hidden - - - if @program.languages.present? - %td - = event.language - - %td.text-center{ 'data-order' => "#{event.require_registration}" } - = check_box_tag @conference.short_title, event.id, event.require_registration, - method: :patch, url: "/admin/conferences/#{@conference.short_title}/program/events/#{event.id}?event[require_registration]=", - class: 'switch-checkbox', data: { size: 'small', - off_color: 'warning', - on_text: 'Yes', - off_text: 'No' } - - if event.require_registration - %br - = link_to registered_text(event), registrations_admin_conference_program_event_path(@conference.short_title, event), class: 'btn btn-xs btn-default' - - %td.text-center{ 'data-order' => "#{event.is_highlight}" } - = check_box_tag @conference.short_title, event.id, event.is_highlight, - method: :patch, url: "/admin/conferences/#{@conference.short_title}/program/events/#{event.id}?event[is_highlight]=", - class: 'switch-checkbox', data: { size: 'small', - off_color: 'warning', - on_text: 'Yes', - 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 - %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 - %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 - - %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 - %td.text-center - = link_to "#{event.comments_count}", admin_conference_program_event_path(@conference.short_title, event), anchor: 'comments-div' + = render 'datatable_row', + event: event, + conference_id: @conference.short_title, + program: @program, + rating_enabled: @program.rating_enabled?, + show_votes: @program.show_voting?, + max_rating: @program.rating, + event_types: @event_types, + tracks: @tracks, + difficulty_levels: @difficulty_levels, + email_settings: @conference.email_settings diff --git a/app/views/admin/events/vote.js.erb b/app/views/admin/events/vote.js.erb index dc677901..46849859 100644 --- a/app/views/admin/events/vote.js.erb +++ b/app/views/admin/events/vote.js.erb @@ -1 +1,10 @@ -$('table#myrating').replaceWith("<%= escape_javascript(render :partial => 'voting') %>"); \ No newline at end of file +$('table#myrating').replaceWith( + "<%= escape_javascript(render 'voting', \ + event: @event, \ + show_votes: @program.show_voting?, \ + max_rating: @program.rating, \ + voting_period: @program.voting_period?, \ + votes: @votes, \ + conference_id: @conference.short_title \ + ) %>" +); diff --git a/db/migrate/20141128073306_migrate_data_remove_column_include_cfp_in_splash_add_column_include_cfp.rb b/db/migrate/20141128073306_migrate_data_remove_column_include_cfp_in_splash_add_column_include_cfp.rb index 2f794f75..169bcfb3 100644 --- a/db/migrate/20141128073306_migrate_data_remove_column_include_cfp_in_splash_add_column_include_cfp.rb +++ b/db/migrate/20141128073306_migrate_data_remove_column_include_cfp_in_splash_add_column_include_cfp.rb @@ -17,7 +17,7 @@ class MigrateDataRemoveColumnIncludeCfpInSplashAddColumnIncludeCfp < ActiveRecor TempConference.all.each do |conference| cfp = TempCallForPaper.find_by(conference_id: conference.id) - if cfp && cfp.include_cfp_in_splash + if cfp&.include_cfp_in_splash splashpage = TempSplashpage.find_or_initialize_by(conference_id: conference.id) splashpage.include_cfp = cfp.include_cfp_in_splash # true splashpage.save! diff --git a/lib/tasks/events_registrations.rake b/lib/tasks/events_registrations.rake index 726b739b..ea0254dd 100644 --- a/lib/tasks/events_registrations.rake +++ b/lib/tasks/events_registrations.rake @@ -5,7 +5,7 @@ namespace :events_registrations do duplicates = EventsRegistration.all.map { |er| er.id if er.valid? == false}.compact puts "Duplicates found: #{duplicates.count}" - if duplicates.count > 0 + if duplicates.count.positive? puts "With IDs: #{duplicates}" end 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 4d92ce0b..61768afc 100644 --- a/spec/helpers/events_helper_spec.rb +++ b/spec/helpers/events_helper_spec.rb @@ -18,4 +18,18 @@ describe EventsHelper, type: :helper do end end end + + describe '#rating_tooltip' do + let(:max_rating) { 5 } + let(:event) { create(:event) } + let(:average_rating) { "#{event.average_rating}/#{max_rating}" } + let(:vote_count) { pluralize(event.voters.length, 'vote') } + + it 'includes the average rating' do + expect(rating_tooltip(event, max_rating)).to match(average_rating) + end + it 'includes the vote count' do + expect(rating_tooltip(event, max_rating)).to match(vote_count) + end + end end