Skip to content

Commit

Permalink
Implement track scheduling wip
Browse files Browse the repository at this point in the history
Allow track organizers to create new schedules for their tracks
Show a unified schedule in Schedules#show
Correctly identify scheduled and unscheduled events in Schedules#events
Fix Event#room and Event#time for when the event is scheduled in a track
schedule
Modify Program#selected_event_schedules to include the event_schedules
of track schedules
Modify Track#revoke_role_and_cleanup to destroy the track's schedule and
revert its events' state to new
Make the rooms of confirmed self_organized tracks appear semitransparent
and don't allow events to be scheduled to it in the conference schedules
during the dates of its track
Add tabs for conference and track schedules in admin/Schedules#index
Add button to Create/Show a tracks schedule in Tracks#index and #show
  • Loading branch information
AEtherC0r3 committed Aug 11, 2017
1 parent ac2b01c commit 08df3cb
Show file tree
Hide file tree
Showing 17 changed files with 180 additions and 71 deletions.
2 changes: 2 additions & 0 deletions .haml-lint_todo.yml
Expand Up @@ -183,6 +183,7 @@ linters:
- "app/views/conferences/_call_for_tracks.html.haml"
- "app/views/admin/tracks/_change_state_dropdown.html.haml"
- "app/views/proposals/_encouragement_text.html.haml"
- "app/views/admin/schedules/_form.html.haml"

# Offense count: 223
InstanceVariables:
Expand Down Expand Up @@ -248,6 +249,7 @@ linters:
- "app/views/admin/cfps/_tracks_cfp.html.haml"
- "app/views/conferences/_call_for_tracks.html.haml"
- "app/views/admin/tracks/_change_state_dropdown.html.haml"
- "app/views/admin/schedules/_form.html.haml"

# Offense count: 32
IdNames:
Expand Down
4 changes: 2 additions & 2 deletions app/assets/javascripts/osem-schedule.js
Expand Up @@ -83,7 +83,7 @@ $(document).ready( function() {
$('.non_schedulable .schedule-event-delete-button').hide();

// set events as draggable
$('.schedulable').draggable({
$('.schedule-event').not('.non_schedulable').draggable({
snap: '.schedule-room-slot',
revertDuration: 200,
revert: function (event, ui) {
Expand All @@ -100,7 +100,7 @@ $(document).ready( function() {
});

// set room cells as droppable
$('.schedule-room-slot').droppable({
$('.schedule-room-slot').not('.non_schedulable .schedule-room-slot').droppable({
accept: '.schedule-event',
tolerance: "pointer",
drop: function(event, ui) {
Expand Down
16 changes: 10 additions & 6 deletions app/controllers/admin/schedules_controller.rb
Expand Up @@ -4,17 +4,21 @@ class SchedulesController < Admin::BaseController
# the schedule of a conference, which should not be accessed in the first place
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource :program, through: :conference, singleton: true
load_and_authorize_resource :schedule, through: :program
load_and_authorize_resource :schedule, through: :program, except: [:new, :create]
load_resource :event_schedules, through: :schedule
load_resource :selected_schedule, through: :program, singleton: true
load_resource :venue, through: :conference, singleton: true

def index; end

def new; end
def new
@schedule = @program.schedules.build(track: @program.tracks.new)
authorize! :new, @schedule
end

def create
@schedule = @program.schedules.new(schedule_params)
authorize! :create, @schedule
if @schedule.save
redirect_to admin_conference_schedule_path(@conference.short_title, @schedule.id),
notice: 'Schedule was successfully created.'
Expand All @@ -33,11 +37,11 @@ def show
@dates = track.start_date..track.end_date
@rooms = [track.room]
else
@program.tracks.self_organized.confirmed.each do |track|
@event_schedules += track.schedule.event_schedules if track.schedule
@program.tracks.self_organized.confirmed.each do |t|
@event_schedules += t.schedule.event_schedules if t.schedule
end
self_organized_tracks_events = @program.tracks.self_organized.confirmed.map do |track|
track.events.confirmed
self_organized_tracks_events = @program.tracks.self_organized.confirmed.map do |t|
t.events.confirmed
end
@unscheduled_events = @program.events.confirmed - @schedule.events - self_organized_tracks_events.flatten.compact
@dates = @conference.start_date..@conference.end_date
Expand Down
13 changes: 8 additions & 5 deletions app/controllers/schedules_controller.rb
Expand Up @@ -24,6 +24,13 @@ def show
return unless @current_day
# the schedule takes you to the current time if it is beetween the start and the end time.
@hour_column = @conference.hours_from_start_time(@conf_start, @conference.end_hour)

# Ids of the schedules of confrmed self_organized tracks along with the selected_schedule_id
@selected_schedules_ids = [@conference.program.selected_schedule_id]
@conference.program.tracks.self_organized.confirmed.each do |track|
@selected_schedules_ids << track.schedule.try(:id)
end
@selected_schedules_ids.compact!
end

def events
Expand All @@ -32,11 +39,7 @@ def events
@events_schedules = @program.selected_event_schedules
@events_schedules = [] unless @events_schedules

@unscheduled_events = if @program.selected_schedule
@program.events.confirmed - @program.selected_schedule.events
else
@program.events.confirmed
end
@unscheduled_events = @program.events.confirmed - @events_schedules.map(&:event)

day = @conference.current_conference_day
@tag = day.strftime('%Y-%m-%d') if day
Expand Down
5 changes: 5 additions & 0 deletions app/models/admin_ability.rb
Expand Up @@ -298,6 +298,11 @@ def signed_in_with_track_organizer_role(user)
schedule.new_record? && conf_ids_for_track_organizer.include?(schedule.program.conference_id)
end

# Show new track schedule button
can :new, Schedule do |schedule|
schedule.new_record? && conf_ids_for_track_organizer.include?(schedule.program.conference_id) && schedule.track.try(:new_record?)
end

can :manage, Schedule, track_id: track_ids_for_track_organizer
can :manage, EventSchedule, schedule: { track_id: track_ids_for_track_organizer }
end
Expand Down
13 changes: 11 additions & 2 deletions app/models/event.rb
Expand Up @@ -243,14 +243,23 @@ def calculate_progress
def room
# We use try(:selected_schedule_id) because this function is used for
# validations so program could not be present there
event_schedules.find_by(schedule_id: program.try(:selected_schedule_id)).try(:room)
if track.try(:self_organized?)
track.room
else
event_schedules.find_by(schedule_id: program.try(:selected_schedule_id)).try(:room)
end
end

##
# Returns the start time at which this event is scheduled
#
def time
event_schedules.find_by(schedule_id: program.selected_schedule_id).try(:start_time)
schedule_id = if track.try(:self_organized?)
track.schedule.id
else
program.selected_schedule_id
end
event_schedules.find_by(schedule_id: schedule_id).try(:start_time)
end

def conference
Expand Down
6 changes: 5 additions & 1 deletion app/models/program.rb
Expand Up @@ -71,7 +71,11 @@ def registered(conference)

# Returns all event_schedules for the selected schedule ordered by start_time
def selected_event_schedules
selected_schedule.event_schedules.order(start_time: :asc) if selected_schedule
event_schedules = selected_schedule.event_schedules.order(start_time: :asc) if selected_schedule
tracks.self_organized.confirmed.order(start_date: :asc).each do |track|
event_schedules += track.schedule.event_schedules.order(start_time: :asc) if track.schedule
end
event_schedules.sort_by(&:start_time) if event_schedules
end

##
Expand Down
8 changes: 7 additions & 1 deletion app/models/track.rb
Expand Up @@ -104,7 +104,10 @@ def assign_role_to_submitter
submitter.add_role 'track_organizer', self
end

# Revokes the track organizer role and removes the track from events that have it set
##
# Revokes the track organizer role, destroys the track's schedule, removes the
# track from events that have it set and reverts their state to new
#
def revoke_role_and_cleanup
role = Role.find_by(name: 'track_organizer', resource: self)

Expand All @@ -114,8 +117,11 @@ def revoke_role_and_cleanup
end
end

schedule.try(:destroy!)

events.each do |event|
event.track = nil
event.state = 'new'
event.save!
end
end
Expand Down
4 changes: 3 additions & 1 deletion app/views/admin/schedules/_day_tab.html.haml
Expand Up @@ -5,7 +5,9 @@
- date_event_schedules = @event_schedules.select{ |e| e.start_time.to_date.eql? date }
.row
- @rooms.each do |room|
.col-md-2.col-xs-6
- non_schedulable = room.tracks.self_organized.confirmed.any? do |track|
- @schedule != track.schedule && (track.start_date..track.end_date).include?(date)
.col-md-2.col-xs-6{ class: ('non_schedulable' if non_schedulable) }
.room-name
- room_date_event_schedules = date_event_schedules.select{ |e| e.room == room }
= room.name
Expand Down
7 changes: 2 additions & 5 deletions app/views/admin/schedules/_event.html.haml
Expand Up @@ -7,16 +7,13 @@
/ subtracting the padding before calculate the number of lines
- lines = (height - 7) / 23
- color = event.track.try(:color).present? ? event.track.try(:color) : 'FFFFFF'
- schedulable = if !event_schedule_id || (event_schedule_id && EventSchedule.find(event_schedule_id).schedule == @schedule)
- 'schedulable'
- else
- 'non_schedulable'
- non_schedulable = event_schedule_id && EventSchedule.find(event_schedule_id).schedule != @schedule
.schedule-event{ style: "height: #{height}px; background-color: #{color}; color: #{contrast_color(color)}", |
id: "event-#{event.id}", |
event_id: event.id, |
length: cells_length, |
event_schedule_id: event_schedule_id, |
class: "#{'compact' if compact_grid} #{schedulable}" }
class: "#{'compact' if compact_grid} #{'non_schedulable' if non_schedulable}" }
.schedule-event-text{ style: "-webkit-line-clamp: #{lines}; height: #{lines * 23}px;"}
%span.schedule-event-delete-button{ onclick: "Schedule.remove(\'event-#{event.id}\');" } X
= event.title
14 changes: 10 additions & 4 deletions app/views/admin/schedules/_form.html.haml
@@ -1,4 +1,10 @@
= semantic_form_for @schedule, url: admin_conference_schedules_path(@conference.short_title) do |f|
= f.input :track, collection: Track.accessible_by(current_ability).where(program: @program).self_organized.confirmed.pluck(:name, :id),
include_blank: false
= f.submit
.row
.col-md-12
.page-header
%h1
New Track Schedule
.row
.col-md-12
= semantic_form_for @schedule, url: admin_conference_schedules_path(@conference.short_title) do |f|
= f.input :track, collection: Track.accessible_by(current_ability).where(program: @program).self_organized.confirmed.pluck(:name, :id), include_blank: false
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }
121 changes: 79 additions & 42 deletions app/views/admin/schedules/index.html.haml
Expand Up @@ -4,45 +4,82 @@
%h1 Schedules
%p.text-muted
The schedules for your conference
.row
.col-md-12
%table.table.table-hover#event_types
%thead
%th Schedule
%th Selected
%th Actions
%tbody
- @schedules.each do |schedule|
%tr
%td
Schedule
= schedule.id
%td
= selected_scheduled?(schedule)
%td
.btn-group{role: "group"}
= link_to 'Show', admin_conference_schedule_path(@conference.short_title, schedule.id),
method: :get, class: 'btn btn-primary'
= link_to 'Delete', admin_conference_schedule_path(@conference.short_title, schedule.id),
method: :delete, class: 'btn btn-danger', data: { confirm: "Do you really want to delete Schedule #{schedule.id}?" }
.row
.col-md-12
- if @venue.try(:rooms).present?
- if can? :create, @program.schedules.new
.text-right
= link_to 'Add Schedule', admin_conference_schedules_path(@conference.short_title),
method: :post, class: 'btn btn-primary'
.text-right
= link_to 'Add Track Schedule', new_admin_conference_schedule_path(@conference.short_title), class: 'btn btn-primary'
- elsif @venue
.h3
No Rooms!
%small
= link_to 'Create rooms', admin_conference_venue_rooms_path
before creating the schedule.
- else
.h3
No Venue!
%small
= link_to 'Create a venue with rooms', new_admin_conference_venue_path
before creating the schedule.
.tabbable
%ul.nav.nav-tabs
%li.active
= link_to 'Conference schedules', '#conference', 'data-toggle' => 'tab'
%li
= link_to 'Track schedules', '#tracks', 'data-toggle' => 'tab'
.tab-content
.tab-pane.active#conference
.row
.col-md-12
%table.table.table-hover
%thead
%th Schedule
%th Selected
%th Actions
%tbody
- @schedules.where(track: nil).each do |schedule|
%tr
%td
Schedule
= schedule.id
%td
= selected_scheduled?(schedule)
%td
.btn-group{role: "group"}
- if can? :show, schedule
= link_to 'Show', admin_conference_schedule_path(@conference.short_title, schedule),
method: :get, class: 'btn btn-primary'
- if can? :destroy, schedule
= link_to 'Delete', admin_conference_schedule_path(@conference.short_title, schedule),
method: :delete, class: 'btn btn-danger', data: { confirm: "Do you really want to delete Schedule #{schedule.id}?" }
.row
.col-md-12
- if @venue.try(:rooms).present?
.text-right
- if can? :create, @program.schedules.new
= link_to 'Add Schedule', admin_conference_schedules_path(@conference.short_title),
method: :post, class: 'btn btn-primary'
- elsif @venue
.h3
No Rooms!
%small
= link_to 'Create rooms', admin_conference_venue_rooms_path
before creating the schedule.
- else
.h3
No Venue!
%small
= link_to 'Create a venue with rooms', new_admin_conference_venue_path
before creating the schedule.
.tab-pane#tracks
.row
.col-md-12
%table.table.table-hover
%thead
%th Schedule
%th Track
%th Actions
%tbody
- @schedules.where.not(track: nil).each do |schedule|
%tr
%td
Schedule
= schedule.id
%td
- track = schedule.track
= link_to track.name, admin_conference_program_track_path(@conference.short_title, track)
%td
.btn-group{role: "group"}
- if can? :show, schedule
= link_to 'Show', admin_conference_schedule_path(@conference.short_title, schedule), class: 'btn btn-primary'
- if can? :destroy, schedule
= link_to 'Delete', admin_conference_schedule_path(@conference.short_title, schedule),
method: :delete, class: 'btn btn-danger', data: { confirm: "Do you really want to delete Schedule #{schedule.id}?" }
.row
.col-md-12
.text-right
- if can? :new, @program.schedules.build(track: @program.tracks.new)
= link_to 'Add Track Schedule', new_admin_conference_schedule_path(@conference.short_title), class: 'btn btn-primary'
9 changes: 9 additions & 0 deletions app/views/admin/tracks/index.html.haml
Expand Up @@ -63,9 +63,18 @@
.btn-group{role: "group"}
- if can? :edit, track
= link_to 'Edit', edit_admin_conference_program_track_path(@conference.short_title, track), class: 'btn btn-primary'
- special_style = true
- if can? :destroy, track
= link_to 'Delete', admin_conference_program_track_path(@conference.short_title, track), method: :delete, class: 'btn btn-danger',
data: { confirm: "Do you really want to delete #{track.name}? Attention: This track will be removed from all Events that have it set" }
- if track.self_organized?
- if track.schedule
- if can? :show, track.schedule
= link_to 'Show Schedule', admin_conference_schedule_path(@conference.short_title, track.schedule), class: 'btn btn-default'
- elsif can? :create, @program.schedules.build(track: track)
= button_to 'Create Schedule', admin_conference_schedules_path(@conference.short_title),
form: { class: 'btn', style: 'padding: 0px 0px; margin-top: -1px;' }, class: 'btn btn-default',
style: ('border-top-left-radius: 0; border-bottom-left-radius: 0;' if special_style), params: { 'schedule[track_id]' => track.id }
.row
.col-md-12.text-right
= link_to 'New Track', new_admin_conference_program_track_path(@conference.short_title), class: 'btn btn-success'
9 changes: 9 additions & 0 deletions app/views/admin/tracks/show.html.haml
Expand Up @@ -21,10 +21,19 @@
- if can? :edit, @track
= link_to 'Edit', edit_admin_conference_program_track_path(@conference.short_title, @track),
method: :get, class: 'btn btn-primary'
- special_style = true
- if can? :destroy, @track
= link_to 'Delete', admin_conference_program_track_path(@conference.short_title, @track),
method: :delete, class: 'btn btn-danger',
data: { confirm: "Do you really want to delete #{@track.name}? Attention: This track will be removed from all Events that have it set" }
- if @track.self_organized?
- if @track.schedule
- if can? :show, @track.schedule
= link_to 'Show Schedule', admin_conference_schedule_path(@conference.short_title, @track.schedule), class: 'btn btn-default'
- elsif can? :create, @program.schedules.build(track: @track)
= button_to 'Create Schedule', admin_conference_schedules_path(@conference.short_title),
form: { class: 'btn', style: 'padding: 0px 0px; margin-top: -1px;' }, class: 'btn btn-default',
style: ('border-top-left-radius: 0; border-bottom-left-radius: 0;' if special_style), params: { 'schedule[track_id]' => @track.id }
.row
.col-md-12
%table.table
Expand Down
2 changes: 1 addition & 1 deletion app/views/schedules/_carousel.html.haml
Expand Up @@ -29,7 +29,7 @@
%td.room{ style: "height: #{ td_height(@rooms) }px;" }
.room.elipsis.break-words{ style: "-webkit-line-clamp: #{ room_lines(@rooms) }; height: #{ room_height(@rooms) }px;" }
= room.name
- event_schedules = room.event_schedules.select{ |e| (e.schedule_id == @conference.program.selected_schedule.id) && (e.end_time > start_time) && (e.start_time <= (start_time + hrs_per_slide.hour)) }
- event_schedules = room.event_schedules.select{ |e| @selected_schedules_ids.include?(e.schedule_id) && (e.end_time > start_time) && (e.start_time <= (start_time + hrs_per_slide.hour)) }
- (1..intervals).each do |i|
- if span > 1
- span -= 1
Expand Down

0 comments on commit 08df3cb

Please sign in to comment.