Merge pull request #76 from CactusPuppy/176894996-vertical-schedule

Vertical schedule
This commit is contained in:
CactusPuppy 2021-05-01 11:00:44 -07:00 committed by GitHub
commit f60b07eb32
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 245 additions and 3 deletions

View file

@ -55,6 +55,8 @@
//= require bootstrap-select
//= require osem-survey
//= require pagy
//= require fullcalendar-scheduler/main.js
//= require fullcalendar
$(document).ready(function() {
$('a[disabled=disabled]').click(function(event){

View file

@ -0,0 +1,30 @@
$( document ).ready(function() {
let calendarEl = document.getElementById('vert-schedule-full-calendar');
if (!calendarEl) return; //check that we need a vertical schedule
let fullcalData = $('#fullcalendar');
let license_key = "<%= Rails.configuration.fullcalendar[:license_key] %>";
var calendar = new FullCalendar.Calendar(calendarEl, {
schedulerLicenseKey: license_key,
nowIndicator: true,
now: fullcalData.data('now'),
expandRows: true,
allDaySlot: false,
slotMinTime: fullcalData.data('startHour') + ':00:00',
slotMaxTime: fullcalData.data('endHour') + ':00:00',
validRange: {
start: fullcalData.data('startDate'),
end: fullcalData.data('endDate')
},
timeZone: fullcalData.data('timezone'),
initialDate: fullcalData.data('day'),
initialView: 'resourceTimeGridDay',
resources: fullcalData.data('rooms'),
events: fullcalData.data('events')
});
calendar.render();
});

View file

@ -26,4 +26,6 @@
*= require osem-navbar
*= require mastodon
*= require conferences
*= require fullcalendar-scheduler/main.css
*/

View file

@ -78,6 +78,25 @@ class SchedulesController < ApplicationController
end
end
def vertical_schedule
dates = @conference.start_date..@conference.end_date
# the schedule takes you to today if it is a date of the schedule
current_day = @conference.current_conference_day
@day = current_day.present? ? current_day : dates.first
event_schedules = @program.selected_event_schedules(
includes: [{ event: %i[event_type speakers submitter] }]
)
unless event_schedules
redirect_to events_conference_schedule_path(@conference.short_title)
return
end
@rooms = FullCalendarFormatter.rooms_to_resources(@conference.venue.rooms) if @conference.venue
@event_schedules = FullCalendarFormatter.event_schedules_to_resources(event_schedules)
@now = Time.now.in_time_zone(@conference.timezone).strftime('%FT%T%:z')
end
def app
@qr_code = RQRCode::QRCode.new(conference_schedule_url).as_svg(offset: 20, color: '000', shape_rendering: 'crispEdges', module_size: 11)
end

View file

@ -31,7 +31,7 @@ class Ability
event.state == 'confirmed'
end
can [:show, :events, :happening_now, :app], Schedule do |schedule|
can [:show, :events, :happening_now, :app, :vertical_schedule], Schedule do |schedule|
schedule.program.schedule_public
end

View file

@ -133,6 +133,14 @@ class EventSchedule < ApplicationRecord
other.schedule_id == schedule_id
end
def start_time_in_conference_timezone
time_in_conference_timezone(start_time)
end
def end_time_in_conference_timezone
time_in_conference_timezone(end_time)
end
private
def replaced_event_schedules
@ -187,4 +195,10 @@ class EventSchedule < ApplicationRecord
errors.add(:schedule, "must be one of #{event.track.name} track's schedules") unless event.track.schedules.include?(schedule)
end
def time_in_conference_timezone(time)
time_in_tz = time.in_time_zone(timezone)
time_in_tz -= time_in_tz.utc_offset
time_in_tz
end
end

View file

@ -0,0 +1,42 @@
class FullCalendarFormatter
def self.rooms_to_resources(rooms)
rooms.map { |room| room_to_resource(room) }.to_json
end
def self.event_schedules_to_resources(event_schedules)
return '[]' if event_schedules.empty?
conference = event_schedules.first.schedule.program.conference
event_schedules.map { |event_schedule| event_schedule_to_resource(conference, event_schedule) }.to_json
end
class << self
include FormatHelper
private
def room_to_resource(room)
{
id: room.guid,
title: room.name
}
end
def event_schedule_to_resource(conference, event_schedule)
event_type_color = event_schedule.event.event_type.color
url = Rails.application.routes.url_helpers.conference_program_proposal_path(conference.short_title, event_schedule.event.id)
{
id: event_schedule.event.guid,
title: event_schedule.event.title,
start: event_schedule.start_time_in_conference_timezone,
end: event_schedule.end_time_in_conference_timezone,
resourceId: event_schedule.room.guid,
url: url,
borderColor: event_type_color,
backgroundColor: event_type_color,
textColor: contrast_color(event_type_color)
}
end
end
end

View file

@ -0,0 +1,12 @@
.container#program
= render 'schedule_tabs', active: 'vertical_schedule'
%h1.text-center
Vertical Schedule for
= @conference.title
#vert-schedule-full-calendar
#fullcalendar{ data: { rooms: @rooms, events: @event_schedules, day: @day,
'start-hour': @conference.start_hour, 'end-hour': @conference.end_hour,
'start-date': @conference.start_date, 'end-date': @conference.end_date + 1.day,
'timezone': @conference.timezone, 'now': @now } }