diff --git a/Gemfile b/Gemfile index b2a23adb..14d7aabb 100644 --- a/Gemfile +++ b/Gemfile @@ -121,6 +121,9 @@ gem 'money-rails' # for lists gem 'acts_as_list' +# for switch checkboxes +gem 'bootstrap-switch-rails', '~> 3.0.0' + # Use guard and spring for testing in development group :development do # rspec Guard rules diff --git a/Gemfile.lock b/Gemfile.lock index c9cce0ee..5025f714 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -70,6 +70,7 @@ GEM bcrypt (3.1.7) bootstrap-sass (3.3.1.0) sass (~> 3.2) + bootstrap-switch-rails (3.0.2) bootstrap3-datetimepicker-rails (3.0.3) momentjs-rails (>= 2.8.1) browser (0.6.0) @@ -438,6 +439,7 @@ DEPENDENCIES awesome_nested_set (~> 3.0.0.rc.5) axlsx_rails bootstrap-sass + bootstrap-switch-rails (~> 3.0.0) bootstrap3-datetimepicker-rails (~> 3.0.2) byebug cancancan diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 0370bfd9..8111385d 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -34,6 +34,8 @@ //= require osem-datepickers //= require osem-datatables //= require osem-tickets +//= require bootstrap-switch +//= require osem-switch $(document).ready(function() { $('a[disabled=disabled]').click(function(event){ diff --git a/app/assets/javascripts/osem-switch.js b/app/assets/javascripts/osem-switch.js new file mode 100644 index 00000000..314f9e3f --- /dev/null +++ b/app/assets/javascripts/osem-switch.js @@ -0,0 +1,16 @@ +$(function () { + $(document).ready(function() { + $("[class='switch-checkbox']").bootstrapSwitch(); + + $('input[class="switch-checkbox"]').on('switchChange.bootstrapSwitch', function(event, state) { + url = "/admin/conference/" + this.name + "/events/" + this.value + + $.ajax({ + url: url, + type: 'PATCH', + data: { event: { is_highlight: state } }, + dataType: 'script' + }); + }); + }); +}); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 4ff9cf5d..9a771225 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -13,4 +13,5 @@ *= require bootstrap-markdown.min *= require bootstrap-datetimepicker *= require leaflet + *= require bootstrap3-switch */ diff --git a/app/assets/stylesheets/osem.css.scss b/app/assets/stylesheets/osem.css.scss index 302e13ee..acab9a05 100644 --- a/app/assets/stylesheets/osem.css.scss +++ b/app/assets/stylesheets/osem.css.scss @@ -53,4 +53,6 @@ body { fieldset { margin: 20px 0 20px 0; -} \ No newline at end of file +} + +.bootstrap-switch { height: 1.7em } diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb index 1b534f33..298b5cd7 100644 --- a/app/controllers/admin/events_controller.rb +++ b/app/controllers/admin/events_controller.rb @@ -18,6 +18,7 @@ module Admin @conference = Conference.find_by(short_title: params[:conference_id]) @events = @conference.events @tracks = @conference.tracks + @difficulty_levels = @conference.difficulty_levels @machine_states = @events.state_machine.states.map @event_types = @conference.event_types @@ -104,24 +105,20 @@ module Admin end def update - if params.has_key? :track_id - @event.update_attribute(:track_id, params[:track_id]) - end - if params.has_key? :event_type_id - @event.update_attribute(:event_type_id, params[:event_type_id]) - end - if params.has_key? :difficulty_level_id - @event.update_attribute(:difficulty_level_id, params[:difficulty_level_id]) - end + if @event.submitter.update_attributes(params[:user]) && + @event.update_attributes(params[:event]) - if @event.submitter.update_attributes!(params[:user]) && @event. - update_attributes!(params[:event]) - flash[:notice] = "Successfully updated #{@event.title}." + if request.xhr? + render js: 'index' + else + flash[:notice] = "Successfully updated event with ID #{@event.id}." + redirect_back_or_to(admin_conference_event_path(@conference.short_title, @event)) + end else - flash[:notice] = 'Update not successful.' + @url = admin_conference_event_path(@conference.short_title, @event) + flash[:notice] = 'Update not successful. ' + @event.errors.full_messages.to_sentence + render :edit end - - redirect_back_or_to(admin_conference_event_path(@conference.short_title, @event)) end def create; end @@ -183,11 +180,11 @@ module Admin alert = @event.update_state(transition, mail, subject, send_mail, params[:send_mail].blank?) if !alert.blank? - return redirect_to(admin_conference_events_path(conference_id: @conference.short_title), - alert: alert) && return + flash[:error] = error + return redirect_back_or_to(admin_conference_events_path(conference_id: @conference.short_title)) && return else - redirect_to(admin_conference_events_path(conference_id: @conference.short_title), - notice: notice) && return + flash[:notice] = notice + redirect_back_or_to(admin_conference_events_path(conference_id: @conference.short_title)) && return end end end diff --git a/app/controllers/conference_controller.rb b/app/controllers/conference_controller.rb index feaa2a0e..3ba355fd 100644 --- a/app/controllers/conference_controller.rb +++ b/app/controllers/conference_controller.rb @@ -7,9 +7,7 @@ class ConferenceController < ApplicationController @antiquated = @conferences - @current end - def show - @keynote_speakers = @conference.keynote_speakers - end + def show; end def schedule @rooms = @conference.rooms diff --git a/app/models/conference.rb b/app/models/conference.rb index 5c1ae0c2..7d4213ae 100644 --- a/app/models/conference.rb +++ b/app/models/conference.rb @@ -43,6 +43,10 @@ class Conference < ActiveRecord::Base def confirmed where(state: :confirmed) end + + def highlights + where(state: :confirmed, is_highlight: true) + end end has_many :event_users, through: :events has_many :speakers, -> { distinct }, through: :event_users, source: :user do @@ -559,10 +563,6 @@ class Conference < ActiveRecord::Base email_settings.updated_conference_registration_dates_template end - def keynote_speakers - User.with_role(:keynote_speaker, self) - end - private after_create do diff --git a/app/models/event.rb b/app/models/event.rb index 81b4103e..47206b94 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -1,9 +1,9 @@ class Event < ActiveRecord::Base include ActiveRecord::Transitions has_paper_trail - attr_accessible :title, :subtitle, :abstract, :description, :event_type_id, :users_attributes, - :user, :proposal_additional_speakers, :track_id, - :require_registration, :difficulty_level_id + attr_accessible :title, :subtitle, :abstract, :description, :user, :users_attributes, + :proposal_additional_speakers, :event_type_id, :track_id, + :difficulty_level_id, :require_registration, :is_highlight acts_as_commentable diff --git a/app/models/splashpage.rb b/app/models/splashpage.rb index e414f75b..07fbb5cc 100644 --- a/app/models/splashpage.rb +++ b/app/models/splashpage.rb @@ -1,7 +1,7 @@ class Splashpage < ActiveRecord::Base belongs_to :conference attr_accessible :public, - :include_tracks, :include_program, + :include_tracks, :include_program, :include_cfp, :include_venue, :include_registrations, :include_tickets, :include_lodgings, :include_sponsors, :include_social_media diff --git a/app/views/admin/call_for_papers/_form.html.haml b/app/views/admin/call_for_papers/_form.html.haml index 11f6476d..f18e6a07 100644 --- a/app/views/admin/call_for_papers/_form.html.haml +++ b/app/views/admin/call_for_papers/_form.html.haml @@ -7,7 +7,6 @@ = semantic_form_for(@call_for_paper, :url => admin_conference_call_for_paper_path(@conference.short_title),:html => {:multipart => true}) do |f| = f.input :start_date, :as => :string, :input_html => { :id => "conference-start-datepicker", :readonly => "readonly" } = f.input :end_date, :as => :string, :input_html => { :id => "conference-end-datepicker", :readonly => "readonly" } - = f.input :include_cfp_in_splash, label: "Show Call for Papers on the splash page" = f.input :schedule_public, label: "Show Schedule on the home and splash page" = f.input :schedule_changes, label: "Allow submitters to change their event after it is scheduled" = f.input :rating, :hint => "Enter the number of different rating levels you want to have for voting on proposals. Enter 0 if you do not want to vote on proposals." diff --git a/app/views/admin/call_for_papers/show.html.haml b/app/views/admin/call_for_papers/show.html.haml index 01322c75..3857e58d 100644 --- a/app/views/admin/call_for_papers/show.html.haml +++ b/app/views/admin/call_for_papers/show.html.haml @@ -29,13 +29,6 @@ Tracks: %dd = tracks(@conference) - %dt - Public - %dd#cfp_in_splash - - if @call_for_paper.include_cfp_in_splash - True - - else - False %dt Public Schedule %dd#schedule_public diff --git a/app/views/admin/event_types/index.html.haml b/app/views/admin/event_types/index.html.haml index 6a9326a1..fddc2dd3 100644 --- a/app/views/admin/event_types/index.html.haml +++ b/app/views/admin/event_types/index.html.haml @@ -22,7 +22,7 @@ = event_type.length Minutes %td - = "#{event_type.minimum_abstract_length}:#{event_type.maximum_abstract_length}" + = "#{event_type.minimum_abstract_length} - #{event_type.maximum_abstract_length}" Words %td %span.label{style: "background-color: #{event_type.color};"} diff --git a/app/views/admin/events/_proposal.html.haml b/app/views/admin/events/_proposal.html.haml index d4f9a2c1..6ec74ec4 100644 --- a/app/views/admin/events/_proposal.html.haml +++ b/app/views/admin/events/_proposal.html.haml @@ -23,8 +23,21 @@ %ul.dropdown-menu - @event_types.each do |type| - %li= link_to type.title, admin_conference_event_path(@conference.short_title, @event, :event_type_id => type.id) , - :method => :put, :event_type_id => type.id + %li= link_to type.title, + admin_conference_event_path(@conference.short_title, + @event, + event: { event_type_id: type.id }), + method: :patch + %tr + %td + %b Highlight + %td + = check_box_tag @conference.short_title, @event.id, @event.is_highlight, class: 'switch-checkbox', + data: { size: "small", + off_color: 'warning', + on_text: 'Yes', + off_text: 'No' } + %tr %td %b State @@ -48,8 +61,11 @@ %ul.dropdown-menu - @tracks.each do |track| - %li= link_to track.name, admin_conference_event_path(@conference.short_title, @event, :track_id => track.id) , - :method => :put, :track_id => track.id + %li= link_to track.name, + admin_conference_event_path(@conference.short_title, + @event, + event: { track_id: track.id }), + method: :patch %tr %td %b Difficulty @@ -63,8 +79,10 @@ %ul.dropdown-menu - @difficulty_levels.each do |difficulty| - %li= link_to difficulty.title, admin_conference_event_path(@conference.short_title, @event, :difficulty_level_id => difficulty.id) , - :method => :put, :difficulty_level_id => difficulty.id + %li= link_to difficulty.title, admin_conference_event_path(@conference.short_title, + @event, + event: { difficulty_level_id: difficulty.id }), + method: :patch - if !@event.room.nil? %tr %td diff --git a/app/views/admin/events/index.html.haml b/app/views/admin/events/index.html.haml index 3dd123e1..f0925497 100644 --- a/app/views/admin/events/index.html.haml +++ b/app/views/admin/events/index.html.haml @@ -22,6 +22,8 @@ %b Submitter %th %b Speaker + %th + %b Highlight %th %b Type %th @@ -70,6 +72,13 @@ = link_to speaker.name, admin_user_path(speaker) - else Unknown speaker + %td{'data-order' => "#{event.is_highlight}"} + = check_box_tag @conference.short_title, event.id, event.is_highlight, class: 'switch-checkbox', + data: { size: "small", + off_color: 'warning', + on_text: 'Yes', + off_text: 'No' } + %td .btn-group %button{:type=>"button", :class=>"btn btn-link dropdown-toggle", "data-toggle"=>"dropdown"} @@ -80,8 +89,11 @@ %span.caret %ul.dropdown-menu - @event_types.each do |type| - %li= link_to type.title, admin_conference_event_path(@conference.short_title, event, :event_type_id => type.id) , - :method => :put, :event_type_id => type.id + %li= link_to type.title, + admin_conference_event_path(@conference.short_title, + event, + event: { event_type_id: type.id }), + method: :patch %td .btn-group %button{:type=>"button", :class=>"btn btn-link dropdown-toggle", "data-toggle"=>"dropdown"} @@ -92,10 +104,27 @@ %span.caret %ul.dropdown-menu - @tracks.each do |track| - %li= link_to track.name, admin_conference_event_path(@conference.short_title, event, :track_id => track.id) , - :method => :put, :track_id => track.id + %li= link_to track.name, + admin_conference_event_path(@conference.short_title, + event, + event: { track_id: track.id }), + method: :patch %td - = event.difficulty_level.title if event.difficulty_level + .btn-group + %button{:type=>"button", :class=>"btn btn-link dropdown-toggle", "data-toggle"=>"dropdown"} + - if event.difficulty_level.nil? + Difficulty + - else + = event.difficulty_level.title + %span.caret + %ul.dropdown-menu + - @difficulty_levels.each do |difficulty_level| + %li= link_to difficulty_level.title, + admin_conference_event_path(@conference.short_title, + event, + event: { difficulty_level_id: difficulty_level.id }), + method: :patch + %td - if event.state == "withdrawn" Withdrawn diff --git a/app/views/admin/splashpages/_form.html.haml b/app/views/admin/splashpages/_form.html.haml index 59babd14..38335b31 100644 --- a/app/views/admin/splashpages/_form.html.haml +++ b/app/views/admin/splashpages/_form.html.haml @@ -8,6 +8,7 @@ = f.inputs name: 'Components' do = f.input :include_tracks, label: 'Display tracks on the splashpage?' = f.input :include_program, label: 'Display program on the splashpage?' + = f.input :include_cfp, label: 'Display call for papers information on splashpage, while cfp is open?' = f.input :include_venue, label: 'Display venue on the splashpage?' = f.input :include_registrations, label: 'Display the registration period on the splashpage?' = f.input :include_tickets, label: 'Display tickets on the splashpage?' diff --git a/app/views/admin/splashpages/show.html.haml b/app/views/admin/splashpages/show.html.haml index cd26a461..ae340cad 100644 --- a/app/views/admin/splashpages/show.html.haml +++ b/app/views/admin/splashpages/show.html.haml @@ -3,7 +3,7 @@ .page-header %h1 Splashpage %p.text-muted - Build a + Build a = link_to "splash page", conference_path(@conference.short_title) with all the information for your conference - if @splashpage @@ -45,6 +45,13 @@ Yes - else No + %dt + Include CFP: + %dd + - if @splashpage.include_cfp + Yes + - else + No %dt Include Social Media: %dd diff --git a/app/views/conference/_program.html.haml b/app/views/conference/_program.html.haml index 40e5db13..b4c6eab1 100644 --- a/app/views/conference/_program.html.haml +++ b/app/views/conference/_program.html.haml @@ -24,9 +24,22 @@ = link_to(schedule_conference_path(@conference.short_title), class: 'btn btn-default btn-lg') do Full Schedule - - #FIXME: Display keynotes https://github.com/openSUSE/osem/issues/544 - - #FIXME: Display schedule highlights https://github.com/openSUSE/osem/issues/545 + %h3.text-center + Don't miss out! + %br + - if @conference.events.highlights.any? + .row + .col-md-12 + - @conference.events.highlights.each_slice(2) do |slice| + .row.row-centered + - slice.each do |event| + .col-md-6.col-centered.col-top.highlights + %p.text-center + %b= event.title + %h5.text-center + = simple_format truncate(event.abstract, length: 500, separator: ' ') + = link_to "Read More", conference_proposal_path(@conference.short_title, event) = content_for :splash_nav do %li diff --git a/app/views/conference/show.html.haml b/app/views/conference/show.html.haml index ea9af0ee..e4354598 100644 --- a/app/views/conference/show.html.haml +++ b/app/views/conference/show.html.haml @@ -33,7 +33,7 @@ %section#program = render 'program' - - if @conference.cfp_open? and @conference.call_for_paper.include_cfp_in_splash? + - if @conference.cfp_open? and @conference.splashpage.include_cfp %section#callforpapers = render 'call_for_paper' @@ -53,7 +53,7 @@ %section#sponsors = render 'sponsors' - - if @conference.splashpage.include_social_media and @conference.contact.has_social_media? + - if @conference.contact.has_social_media? and @conference.splashpage.include_social_media %section#social-media = render 'social_media' diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index a2eb5b4c..133eec2f 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -7,6 +7,7 @@ %meta{:content => "", :name => "author"} = stylesheet_link_tag "application", :media => "all" = javascript_include_tag "application" + = csrf_meta_tags :javascript window.liveSettings = { diff --git a/app/views/proposal/_proposal_form.html.haml b/app/views/proposal/_proposal_form.html.haml index 1d46f079..805d2224 100644 --- a/app/views/proposal/_proposal_form.html.haml +++ b/app/views/proposal/_proposal_form.html.haml @@ -11,13 +11,18 @@ %section#details - if can? :update, @event or can? :create, @event = f.input :event_type_id, as: :select, - collection: @conference.event_types.map {|x| ["#{x.title} - #{show_time(x.length)}", x.id, - data: { min_words: x.minimum_abstract_length, max_words: x.maximum_abstract_length }]}, + collection: @conference.event_types.map {|type| ["#{type.title} - #{show_time(type.length)}", type.id, + data: { min_words: type.minimum_abstract_length, max_words: type.maximum_abstract_length }]}, include_blank: false, label: 'Session Type' - else Event type: #{@event.event_type.title} + + - if current_user.has_any_role? :admin, { name: :organizer, resource: @conference }, { name: :cfp, resource: @conference } + = f.label :is_highlight %br - %br + = f.check_box :is_highlight, class: 'switch-checkbox', data: { size: "small" } + + %br = f.input :difficulty_level, :as => :select, :collection => @conference.difficulty_levels, :include_blank => "(Please select)" if @conference.difficulty_levels.any? = f.input :require_registration = f.input :abstract, :input_html => {:rows => 5, :class => "span11"}, diff --git a/db/migrate/20141127161313_add_is_highlight_in_events.rb b/db/migrate/20141127161313_add_is_highlight_in_events.rb new file mode 100644 index 00000000..0b61ef26 --- /dev/null +++ b/db/migrate/20141127161313_add_is_highlight_in_events.rb @@ -0,0 +1,5 @@ +class AddIsHighlightInEvents < ActiveRecord::Migration + def change + add_column :events, :is_highlight, :boolean, default: false + end +end diff --git a/db/migrate/20141128073306_migrate_data_remove_column_include_cfp_in_splash_add_column_include_cfp.rb b/db/migrate/20141128073306_migrate_data_remove_column_include_cfp_in_splash_add_column_include_cfp.rb new file mode 100644 index 00000000..037cb077 --- /dev/null +++ b/db/migrate/20141128073306_migrate_data_remove_column_include_cfp_in_splash_add_column_include_cfp.rb @@ -0,0 +1,46 @@ +class MigrateDataRemoveColumnIncludeCfpInSplashAddColumnIncludeCfp < ActiveRecord::Migration + class TempConference < ActiveRecord::Base + self.table_name = 'conferences' + end + + class TempCallForPaper< ActiveRecord::Base + self.table_name = 'call_for_papers' + end + + class TempSplashpage < ActiveRecord::Base + self.table_name = 'splashpages' + attr_accessible :conference_id + end + + def up + add_column :splashpages, :include_cfp, :boolean, default: false + + TempConference.all.each do |conference| + cfp = TempCallForPaper.find_by(conference_id: conference.id) + + if cfp && cfp.include_cfp_in_splash + splashpage = TempSplashpage.find_or_initialize_by(conference_id: conference.id) + splashpage.include_cfp = cfp.include_cfp_in_splash # true + splashpage.save! + end + end + + remove_column :call_for_papers, :include_cfp_in_splash, :boolean, default: false + end + + def down + add_column :call_for_papers, :include_cfp_in_splash, :boolean, default: false + + TempConference.all.each do |conference| + splashpage = TempSplashpage.find_by(conference_id: conference.id) + cfp = TempCallForPaper.find_by(conference_id: conference.id) + + if splashpage && cfp + cfp.include_cfp_in_splash = splashpage.include_cfp + cfp.save! + end + end + + remove_column :splashpages, :include_cfp, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 065acd24..7c94011c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -32,15 +32,14 @@ ActiveRecord::Schema.define(version: 20141130182139) do end create_table "call_for_papers", force: true do |t| - t.date "start_date", null: false - t.date "end_date", null: false + t.date "start_date", null: false + t.date "end_date", null: false t.integer "conference_id" t.datetime "created_at" t.datetime "updated_at" - t.boolean "schedule_changes", default: false - t.integer "rating", default: 3 + t.boolean "schedule_changes", default: false + t.integer "rating", default: 3 t.boolean "schedule_public" - t.boolean "include_cfp_in_splash", default: false end create_table "campaigns", force: true do |t| @@ -234,6 +233,7 @@ ActiveRecord::Schema.define(version: 20141130182139) do t.boolean "require_registration" t.integer "difficulty_level_id" t.integer "week" + t.boolean "is_highlight", default: false end create_table "events_registrations", id: false, force: true do |t| @@ -378,6 +378,7 @@ ActiveRecord::Schema.define(version: 20141130182139) do t.boolean "include_lodgings" t.datetime "created_at" t.datetime "updated_at" + t.boolean "include_cfp", default: false end create_table "sponsors", force: true do |t| diff --git a/spec/views/conference/show.html.haml_spec.rb b/spec/views/conference/show.html.haml_spec.rb index 39003be6..c70c32cf 100644 --- a/spec/views/conference/show.html.haml_spec.rb +++ b/spec/views/conference/show.html.haml_spec.rb @@ -12,7 +12,8 @@ describe 'conference/show.html.haml' do include_tickets: true, include_social_media: true, include_venue: true, - include_lodgings: true) + include_lodgings: true, + include_cfp: true) @conference.contact.update(sponsor_email: 'example@example.com', facebook: 'http://facebook.com', @@ -24,8 +25,7 @@ describe 'conference/show.html.haml' do start_date: Date.yesterday, end_date: Date.tomorrow) - @conference.call_for_paper = create(:call_for_paper, conference: @conference, - include_cfp_in_splash: true) + @conference.call_for_paper = create(:call_for_paper, conference: @conference) @conference.sponsorship_levels << create(:sponsorship_level, conference: @conference) @sponsorship_level = @conference.sponsorship_levels.first