diff --git a/app/assets/javascripts/osem-schedule.js b/app/assets/javascripts/osem-schedule.js index 0e44a41f..87aed96c 100644 --- a/app/assets/javascripts/osem-schedule.js +++ b/app/assets/javascripts/osem-schedule.js @@ -71,7 +71,7 @@ var Schedule = { var e = $("#" + element); var unscheduled = $(".unscheduled-events"); - var url = '/admin/conference/' + conference + '/schedule'; + var url = '/admin/conference/' + conference + '/schedule/' + schedule_id; var params = { event: e.attr("guid"), room: "none", @@ -93,7 +93,7 @@ var Schedule = { }); }, save: function (event_id, room_id, date, time) { - var url = '/admin/conference/' + conference + '/schedule'; + var url = '/admin/conference/' + conference + '/schedule/' + schedule_id; var params = { event: event_id, room: room_id, diff --git a/app/controllers/admin/schedules_controller.rb b/app/controllers/admin/schedule_controller.rb similarity index 62% rename from app/controllers/admin/schedules_controller.rb rename to app/controllers/admin/schedule_controller.rb index 876ae071..9248b244 100644 --- a/app/controllers/admin/schedules_controller.rb +++ b/app/controllers/admin/schedule_controller.rb @@ -1,38 +1,47 @@ module Admin - class SchedulesController < Admin::BaseController + class ScheduleController < Admin::BaseController # By authorizing 'conference' resource, we can ensure there will be no unauthorized access to # 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_resource :venue, through: :conference, singleton: true - skip_before_filter :verify_authenticity_token, only: [:update] + skip_before_action :verify_authenticity_token, only: [:update] + + def index + @schedules = @conference.program.schedules + @selected_schedule = @conference.program.selected_schedule + end + + def create + new_schedule = @program.schedules.create + redirect_to action: 'show', id: new_schedule.id + end def show - event = @program.events.new - authorize! :update, event - event.destroy - if @conference.nil? - redirect_to admin_conference_index_path - return - end + authorize! :update, @program.events.new + @schedule_id = params[:id].to_i + @selected_schedule_id = @conference.program.selected_schedule.try(:id) @dates = @conference.start_date..@conference.end_date - if @venue && @venue.rooms.any? - @rooms = @venue.rooms - else - @rooms = [ Room.new(name: 'No Rooms!', size: 0) ] - end - # if there is not selected schedule we create it - unless @program.selected_schedule.present? - schedule = @program.schedules.create - @program.selected_schedule = schedule - @program.save! - end - @schedule_id = @program.selected_schedule.id + @rooms = (@venue && @venue.rooms.any?) ? @venue.rooms : [Room.new(name: 'No Rooms!', size: 0)] end def update - authorize! :update, @program.events.new + event = @program.events.new + authorize! :update, event + event.destroy + + if params[:selected_schedule].present? + if params[:selected_schedule] == 'true' + @program.selected_schedule_id = params[:id].to_i + elsif params[:selected_schedule] == 'false' && (@program.selected_schedule_id == params[:id].to_i) + @program.selected_schedule_id = nil + end + @program.save! + render json: { 'status' => 'ok' } + return + end + event = Event.where(guid: params[:event]).first error_message = nil if event.nil? @@ -74,12 +83,18 @@ module Admin render json: { 'status' => 'ok' } end - private - - def event_params - params.require(:event).permit(:guid) + def destroy + if @schedule.destroy + redirect_to admin_conference_schedule_index_path(conference_id: @conference.short_title), + notice: 'Schedule successfully deleted.' + else + redirect_to admin_conference_schedule_index_path(conference_id: @conference.short_title), + error: "Schedule couldn't be deleted. #{@schedule.errors.full_messages.join('. ')}." + end end + private + def room_params params.require(:room) end diff --git a/app/views/admin/schedules/_day_tab.html.haml b/app/views/admin/schedule/_day_tab.html.haml similarity index 100% rename from app/views/admin/schedules/_day_tab.html.haml rename to app/views/admin/schedule/_day_tab.html.haml diff --git a/app/views/admin/schedule/index.html.haml b/app/views/admin/schedule/index.html.haml new file mode 100644 index 00000000..c49000e3 --- /dev/null +++ b/app/views/admin/schedule/index.html.haml @@ -0,0 +1,32 @@ +.row + .col-md-12 + .page-header + %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 + = (schedule == @selected_schedule) ? 'Yes' : 'No' + %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.text-right + = link_to 'Add Schedule', admin_conference_schedule_index_path(@conference.short_title), + method: :post, class: 'btn btn-primary' diff --git a/app/views/admin/schedules/show.html.haml b/app/views/admin/schedule/show.html.haml similarity index 60% rename from app/views/admin/schedules/show.html.haml rename to app/views/admin/schedule/show.html.haml index afdc7716..dc26bb73 100644 --- a/app/views/admin/schedules/show.html.haml +++ b/app/views/admin/schedule/show.html.haml @@ -7,6 +7,13 @@ .row .col-md-2 + Selected schedule + = check_box_tag @conference.short_title, @schedule_id, (@schedule_id == @selected_schedule_id), + method: :put, url: "/admin/conference/#{@conference.short_title}/schedule/#{@schedule_id}?selected_schedule=", + class: 'switch-checkbox', data: { size: 'small', + off_color: 'warning', + on_text: 'Yes', + off_text: 'No' } .h4 Unscheduled events .unscheduled-events diff --git a/app/views/layouts/_admin_sidebar.html.haml b/app/views/layouts/_admin_sidebar.html.haml index da726468..cb074b57 100644 --- a/app/views/layouts/_admin_sidebar.html.haml +++ b/app/views/layouts/_admin_sidebar.html.haml @@ -82,8 +82,8 @@ %li{:class=> active_nav_li(admin_conference_program_difficulty_levels_path(@conference.short_title))} = link_to 'Difficulty Levels', admin_conference_program_difficulty_levels_path(@conference.short_title) - if can? :update, @conference.program.events.build - %li{class: active_nav_li(admin_conference_schedule_path(@conference.short_title))} - = link_to 'Schedule', admin_conference_schedule_path(@conference.short_title) + %li{class: active_nav_li(admin_conference_schedule_index_path(@conference.short_title))} + = link_to 'Schedules', admin_conference_schedule_index_path(@conference.short_title) - if can? :update, Registration.new(conference_id: @conference.id) %li{:class=> active_nav_li(admin_conference_registrations_path(@conference.short_title))} diff --git a/config/routes.rb b/config/routes.rb index a2bd18a6..dff245e5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,7 +22,7 @@ Osem::Application.routes.draw do resources :comments, only: [:index] resources :conference do resource :contact, except: [:index, :new, :create, :show, :destroy] - resource :schedule, only: [:show, :update] + resources :schedule, only: [:index, :create, :show, :update, :destroy] get 'commercials/render_commercial' => 'commercials#render_commercial' resources :commercials, only: [:index, :create, :update, :destroy] get '/volunteers_list' => 'volunteers#show' diff --git a/spec/features/ability_spec.rb b/spec/features/ability_spec.rb index 60248c30..fbda85b7 100644 --- a/spec/features/ability_spec.rb +++ b/spec/features/ability_spec.rb @@ -69,8 +69,8 @@ feature 'Has correct abilities' do visit admin_conference_program_events_path(conference1.short_title) expect(current_path).to eq(admin_conference_program_events_path(conference1.short_title)) - visit admin_conference_schedule_path(conference1.short_title) - expect(current_path).to eq(admin_conference_schedule_path(conference1.short_title)) + visit admin_conference_schedule_index_path(conference1.short_title) + expect(current_path).to eq(admin_conference_schedule_index_path(conference1.short_title)) visit admin_conference_campaigns_path(conference1.short_title) expect(current_path).to eq(admin_conference_campaigns_path(conference1.short_title)) @@ -147,8 +147,8 @@ feature 'Has correct abilities' do visit admin_conference_program_events_path(conference2.short_title) expect(current_path).to eq(admin_conference_program_events_path(conference2.short_title)) - visit admin_conference_schedule_path(conference2.short_title) - expect(current_path).to eq(admin_conference_schedule_path(conference2.short_title)) + visit admin_conference_schedule_index_path(conference2.short_title) + expect(current_path).to eq(root_path) visit admin_conference_campaigns_path(conference2.short_title) expect(current_path).to eq(root_path) @@ -221,7 +221,7 @@ feature 'Has correct abilities' do visit admin_conference_program_events_path(conference3.short_title) expect(current_path).to eq(root_path) - visit admin_conference_schedule_path(conference3.short_title) + visit admin_conference_schedule_index_path(conference3.short_title) expect(current_path).to eq(root_path) visit admin_conference_campaigns_path(conference3.short_title)