diff --git a/app/controllers/schedules_controller.rb b/app/controllers/schedules_controller.rb index 2d3f22ef..cbff9cc8 100644 --- a/app/controllers/schedules_controller.rb +++ b/app/controllers/schedules_controller.rb @@ -60,6 +60,14 @@ class SchedulesController < ApplicationController @tag = day.strftime('%Y-%m-%d') if day end + def happening_now + @events_schedules = @program.selected_event_schedules( + includes: [:room, { event: %i[track event_type speakers submitter] }] + ).select(&:happening_now?) + @events_schedules = [] unless @events_schedules + @current_time = Time.now.in_time_zone(@conference.timezone) + end + def app @qr_code = RQRCode::QRCode.new(conference_schedule_url).as_svg(offset: 20, color: '000', shape_rendering: 'crispEdges', module_size: 11) end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 69021cfd..af956bfe 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -177,14 +177,14 @@ module EventsHelper return unless event.url.present? && current_user conference = event.conference - is_today = event.time&.in_time_zone(conference.timezone).to_date == conference.current_conference_day + is_now = event.happening_now? if current_user.roles.where(id: conference.roles).any? # Show Pre-Event links for any memeber of the conference team. - link_to("Join Live Event #{'(Pre-Event)' unless is_today}", + link_to("Join Live Event #{'(Pre-Event)' unless is_now}", event.url, target: '_blank') elsif current_user.registered_to_event?(conference) - if is_today + if is_now link_to('Join Live Event', event.url, target: '_blank') else link_to('Live Event Link Coming Soon', '#') diff --git a/app/models/ability.rb b/app/models/ability.rb index e4d30311..9db7bacf 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -31,7 +31,7 @@ class Ability event.state == 'confirmed' end - can [:show, :events, :app], Schedule do |schedule| + can [:show, :events, :happening_now, :app], Schedule do |schedule| schedule.program.schedule_public end diff --git a/app/models/event.rb b/app/models/event.rb index 342ef870..2007dec6 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -274,6 +274,14 @@ class Event < ApplicationRecord event_schedules.find_by(schedule_id: selected_schedule_id).try(:start_time) end + ## + # Returns the start time at which this event is scheduled + # + def happening_now? + event_schedules.find_by(schedule_id: selected_schedule_id).try(:happening_now?) + end + + ## # Returns true or false, if the event is already over or not # diff --git a/app/models/event_schedule.rb b/app/models/event_schedule.rb index 984dedc9..12eeb30c 100644 --- a/app/models/event_schedule.rb +++ b/app/models/event_schedule.rb @@ -27,15 +27,21 @@ class EventSchedule < ApplicationRecord delegate :guid, to: :room, prefix: true - delegate :timezone, to: :event + def timezone + event.conference.timezone + end ## - # True within 1 hour before and after the event. + # True within `threshold` before and after the event. # def happening_now?(threshold=30.minutes) - pre_start_time = (start_time - threshold).in_time_zone(timezone) - end_time_with_threshold = (end_time + threshold).in_time_zone(timezone) - (pre_start_time..end_time_with_threshold).cover?(Time.now.in_time_zone(timezone)) + in_tz_start = start_time.in_time_zone(timezone) + in_tz_end = start_time.in_time_zone(timezone) + in_tz_start -= in_tz_start.utc_offset + in_tz_end -= in_tz_end.utc_offset + begin_range = Time.now - threshold + end_range = Time.now + threshold + 1.minute # The range is exclusive. + (begin_range..end_range).cover?(in_tz_start) || (begin_range..end_range).cover?(in_tz_end) end def self.withdrawn_or_canceled_event_schedules(schedule_ids) diff --git a/app/views/schedules/_schedule_tabs.html.haml b/app/views/schedules/_schedule_tabs.html.haml index f3d83b34..33ba7f37 100644 --- a/app/views/schedules/_schedule_tabs.html.haml +++ b/app/views/schedules/_schedule_tabs.html.haml @@ -3,5 +3,7 @@ %ul.nav.nav-tabs{ role: "tablist" } %li{ class: "program #{ 'active' if active == 'program' }", role: "presentation" } = link_to('All events', events_conference_schedule_path(@conference.short_title)) + %li{ class: "program #{ 'active' if active == 'now' }", role: "presentation" } + = link_to('Happening Now', happening_now_conference_schedule_path(@conference.short_title)) %li{ class: "schedule #{ 'active' if active == 'schedule' }", role: "presentation" } = link_to('Schedule', conference_schedule_path(@conference.short_title)) diff --git a/app/views/schedules/happening_now.haml b/app/views/schedules/happening_now.haml new file mode 100644 index 00000000..7b6d9c22 --- /dev/null +++ b/app/views/schedules/happening_now.haml @@ -0,0 +1,46 @@ +.container#program + = render partial: 'schedule_tabs', locals: { active: 'now' } + + %h1.text-center + Happening Now at + = @conference.title + -# .dropdown.program-dropdown + -# %button{ type: "button", class: "btn btn-default dropdown-toggle", 'data-toggle' => "dropdown" } + -# Dates + -# %span.caret + -# %ul.dropdown-menu + -# - @dates.each do |date| + -# %li.li-dropdown-program + -# = link_to date, "##{date}", class: "program-selector#{ ' no-events-day' unless @conference.program.any_event_for_this_date?(date) }" + -# - if @unscheduled_events.any? + -# %li.li-dropdown-program + -# = link_to('Unscheduled', "#unscheduled", class: 'program-selector') + + .row + %h2 + #{pluralize(@events_schedules.count, 'Event')} Occurring Within The Next 30 minutes. + %h3 + This page was loaded at #{Time.now.strftime('%Y-%m-%d at %H:%M %P')} + %p + P.S. This page is in beta, and if it doesn't make sense, we're sorry. + %small + Times & Timezones...only of the many 2 hard problems in computer science. + + .row + / scheduled events + - @events_schedules.each do |event_schedule| + .col-xs-12.col-md-11.col-md-offset-1 + = render partial: 'event', locals: { event: event_schedule.event, event_schedule: event_schedule } + +:javascript + $('.program-selector').on('click', function(e) { + $('.li-dropdown-program').removeClass('active'); + }); + + // Go to current date and time + $(document).ready(function(){ + tag = "#{ @tag }"; + if(tag !== ""){ + document.getElementById(tag).scrollIntoView(); + } + }); diff --git a/config/routes.rb b/config/routes.rb index 0d6084e6..79b03928 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -204,6 +204,7 @@ Osem::Application.routes.draw do end member do get :events + get :happening_now end end end