Merge pull request #76 from CactusPuppy/176894996-vertical-schedule
Vertical schedule
This commit is contained in:
commit
f60b07eb32
19 changed files with 245 additions and 3 deletions
|
|
@ -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){
|
||||
|
|
|
|||
30
app/assets/javascripts/fullcalendar.js.erb
Normal file
30
app/assets/javascripts/fullcalendar.js.erb
Normal 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();
|
||||
});
|
||||
|
||||
|
||||
|
|
@ -26,4 +26,6 @@
|
|||
*= require osem-navbar
|
||||
*= require mastodon
|
||||
*= require conferences
|
||||
|
||||
*= require fullcalendar-scheduler/main.css
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
42
app/services/full_calendar_formatter.rb
Normal file
42
app/services/full_calendar_formatter.rb
Normal 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
|
||||
12
app/views/schedules/vertical_schedule.haml
Normal file
12
app/views/schedules/vertical_schedule.haml
Normal 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 } }
|
||||
Loading…
Add table
Add a link
Reference in a new issue