From bde5098a4cbf62c0095be9c5289de59e418882c8 Mon Sep 17 00:00:00 2001 From: "depfu[bot]" <23717796+depfu[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2019 18:26:21 +0000 Subject: [PATCH 01/61] Update rails-assets-bootstrap-select to version 1.13.10 --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e4c9da33..296669ef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -399,16 +399,16 @@ GEM bundler (>= 1.3.0) railties (= 5.2.3) sprockets-rails (>= 2.0.0) - rails-assets-bootstrap (3.3.6) - rails-assets-jquery (>= 1.9.1, < 3) + rails-assets-bootstrap (3.4.1) + rails-assets-jquery (>= 1.9.1, < 4) rails-assets-bootstrap-markdown (2.10.0) rails-assets-bootstrap (~> 3) - rails-assets-bootstrap-select (1.13.3) + rails-assets-bootstrap-select (1.13.10) rails-assets-bootstrap (>= 3.0.0) rails-assets-jquery (>= 1.9.1, < 4) rails-assets-date.format (1.2.3) rails-assets-holderjs (2.9.6) - rails-assets-jquery (2.2.4) + rails-assets-jquery (3.4.1) rails-assets-jquery-smooth-scroll (2.2.0) rails-assets-jquery (>= 1.7.0) rails-assets-markdown (0.5.0) From 3a94aeb07322b0dc49ed976468d7ef4166aabfd1 Mon Sep 17 00:00:00 2001 From: James Mason Date: Sat, 29 Dec 2018 15:36:17 -0800 Subject: [PATCH 02/61] Remove travel schedule from registration (cherry picked from commit d18cc02f0185df39bb4213d8a63a955dfb433dcb) Re: https://github.com/openSUSE/osem/issues/2333 --- CHANGES.md | 6 ++++ app/assets/javascripts/osem-datepickers.js | 34 ------------------- .../admin/registrations_controller.rb | 2 +- .../conference_registrations_controller.rb | 2 +- app/datatables/registration_datatable.rb | 4 --- app/models/registration.rb | 15 -------- app/views/admin/registrations/index.html.haml | 18 ---------- app/views/admin/registrations/index.pdf.prawn | 6 +--- .../admin/registrations/index.xlsx.axlsx | 5 +-- .../_registration_info.html.haml | 6 ---- .../conference_registrations/show.html.haml | 22 ------------ ...ve_arrival_departure_from_registrations.rb | 6 ++++ db/schema.rb | 4 +-- ...conference_registration_controller_spec.rb | 20 ++++++----- spec/models/registration_spec.rb | 22 ------------ 15 files changed, 28 insertions(+), 144 deletions(-) create mode 100644 db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb diff --git a/CHANGES.md b/CHANGES.md index db20a234..432cdcdf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,12 @@ Not release yet... ## Update from 1.0 +### Dropped travel information +We have dropped input and storage of travel schedules for event registrants. If +you would like to continue to collect travel schedules, please create a custom +survey for this purpose. +_Please be aware that existing travel data will be destroyed during migration._ + ### Multiple Schedules A conference can have multiple schedules now so it's easier for organizers to test schedules and collaborate on different versions. diff --git a/app/assets/javascripts/osem-datepickers.js b/app/assets/javascripts/osem-datepickers.js index b907aa0c..c11c61a9 100644 --- a/app/assets/javascripts/osem-datepickers.js +++ b/app/assets/javascripts/osem-datepickers.js @@ -13,40 +13,6 @@ $(function () { format: 'YYYY-MM-DD HH:mm' }); - $("#registration-arrival-datepicker").datetimepicker({ - useCurrent: false, - stepping: 15, - sideBySide: true, - format: "YYYY-MM-DD HH:mm", - // current_date <= arrival_date <= end_date - maxDate : $("#registration-arrival-datepicker").attr('end_date'), - minDate : today - }); - - $("#registration-departure-datepicker").datetimepicker({ - useCurrent: false, - stepping: 15, - sideBySide: true, - format: "YYYY-MM-DD HH:mm", - // departure_date > start_date - minDate : $("#registration-arrival-datepicker").attr('start_date') - }); - - $("#registration-arrival-datepicker").on("dp.change",function (e) { - // departure_date > start_date,arrival_date - if ((new Date(e.date).getTime()) > (new Date($("#registration-arrival-datepicker").attr('start_date')).getTime())){ - $('#registration-departure-datepicker').data("DateTimePicker").minDate(e.date); - } - else{ - $('#registration-departure-datepicker').data("DateTimePicker").minDate($("#registration-arrival-datepicker").attr('start_date')); - } - }); - - // departure_date >= arrival_date - $("#registration-departure-datepicker").on("dp.change",function (e) { - $('#registration-arrival-datepicker').data("DateTimePicker").maxDate(e.date); - }); - $("#conference-start-datepicker").datetimepicker({ useCurrent: false, format: "YYYY-MM-DD", diff --git a/app/controllers/admin/registrations_controller.rb b/app/controllers/admin/registrations_controller.rb index 89c4d069..ef94ae2e 100644 --- a/app/controllers/admin/registrations_controller.rb +++ b/app/controllers/admin/registrations_controller.rb @@ -82,7 +82,7 @@ module Admin def registration_params params.require(:registration).permit( - :user_id, :conference_id, :arrival, :departure, :attended, + :user_id, :conference_id, :attended, :volunteer, :other_special_needs, :accepted_code_of_conduct, vchoice_ids: [], qanswer_ids: [], qanswers_attributes: [], event_ids: [] ) diff --git a/app/controllers/conference_registrations_controller.rb b/app/controllers/conference_registrations_controller.rb index 5c17d8dc..887d0ce1 100644 --- a/app/controllers/conference_registrations_controller.rb +++ b/app/controllers/conference_registrations_controller.rb @@ -110,7 +110,7 @@ class ConferenceRegistrationsController < ApplicationController def registration_params params.require(:registration) .permit( - :conference_id, :arrival, :departure, + :conference_id, :volunteer, :accepted_code_of_conduct, vchoice_ids: [], qanswer_ids: [], qanswers_attributes: [], diff --git a/app/datatables/registration_datatable.rb b/app/datatables/registration_datatable.rb index bdd97e72..a20fe3af 100644 --- a/app/datatables/registration_datatable.rb +++ b/app/datatables/registration_datatable.rb @@ -10,8 +10,6 @@ class RegistrationDatatable < AjaxDatatablesRails::Base roles: { source: 'Role.name' }, email: { source: 'User.email' }, accepted_code_of_conduct: { source: 'Registration.accepted_code_of_conduct', searchable: false }, - arrival: { source: 'Registration.arrival', searchable: false }, - departure: { source: 'Registration.departure', searchable: false }, actions: { source: 'Registration.id', searchable: false, orderable: false } } end @@ -36,8 +34,6 @@ class RegistrationDatatable < AjaxDatatablesRails::Base roles: conference_role_titles(record.user), email: record.email, accepted_code_of_conduct: !!record.accepted_code_of_conduct, # rubocop:disable Style/DoubleNegation - arrival: record.arrival&.utc, - departure: record.departure&.utc, questions: {}, edit_url: edit_admin_conference_registration_path(conference, record), DT_RowId: record.id diff --git a/app/models/registration.rb b/app/models/registration.rb index 84a9aba0..759003fd 100644 --- a/app/models/registration.rb +++ b/app/models/registration.rb @@ -28,8 +28,6 @@ class Registration < ApplicationRecord validates :user_id, uniqueness: { scope: :conference_id, message: 'already Registered!' } validate :registration_limit_not_exceed, on: :create - validate :registration_to_events_only_if_present - validates :accepted_code_of_conduct, acceptance: { if: -> { conference.try(:code_of_conduct).present? } } @@ -48,19 +46,6 @@ class Registration < ApplicationRecord private - ## - # If the user registers to attend events that are already scheduled, - # only allow registration to events if the user will be present - # (based on arrival and departure attributes) - # No validation if arrival/departure attributes are empty - def registration_to_events_only_if_present - if (arrival || departure) && events.pluck(:start_time).any? - errors.add(:arrival, 'is too late! You cannot register for events that take place before your arrival') if events.pluck(:start_time).compact.map { |x| x < arrival }.any? - - errors.add(:departure, 'is too early! You cannot register for events that take place after your departure') if events.pluck(:start_time).compact.map { |x| x > departure }.any? - end - end - def subscribe_to_conference Subscription.create(conference_id: conference.id, user_id: user.id) end diff --git a/app/views/admin/registrations/index.html.haml b/app/views/admin/registrations/index.html.haml index 8ea544d8..09f674e9 100644 --- a/app/views/admin/registrations/index.html.haml +++ b/app/views/admin/registrations/index.html.haml @@ -30,8 +30,6 @@ %th{ width: '0' } E-Mail %th{ width: '0' } %abbr{ title: 'Code of Conduct' } CoC - %th{ width: '0' } Arrival - %th{ width: '0' } Departure %th{ width: '0' } Actions %tbody @@ -81,22 +79,6 @@ "className": "code-of-conduct text-center", "searchable": false }, - { - "data": "arrival", - "searchable": false, - "render": function(data, type, row) { - if (data) { return moment(data).format('ll LT'); } - return ''; - } - }, - { - "data": "departure", - "searchable": false, - "render": function(data, type, row) { - if (data) { return moment(data).format('ll LT'); } - return ''; - } - }, { "data": null, "className": "actions", diff --git a/app/views/admin/registrations/index.pdf.prawn b/app/views/admin/registrations/index.pdf.prawn index d7c97ef2..3edebf04 100644 --- a/app/views/admin/registrations/index.pdf.prawn +++ b/app/views/admin/registrations/index.pdf.prawn @@ -4,9 +4,7 @@ prawn_document(force_download: true, filename: @pdf_filename, page_layout: :land 'Name', 'Nickname', 'Affiliation', - 'Email', - 'Arrival Date', - 'Departure Date'] + 'Email'] @conference.questions.each do |question| header_array << question.title end @@ -19,8 +17,6 @@ prawn_document(force_download: true, filename: @pdf_filename, page_layout: :land row << registration.nickname row << registration.affiliation row << registration.email - row << registration.arrival.to_s || '' - row << registration.departure.to_s || '' @conference.questions.each do |question| qa = registration.qanswers.find_by(question: question) diff --git a/app/views/admin/registrations/index.xlsx.axlsx b/app/views/admin/registrations/index.xlsx.axlsx index ee49eb4d..a95c163e 100644 --- a/app/views/admin/registrations/index.xlsx.axlsx +++ b/app/views/admin/registrations/index.xlsx.axlsx @@ -3,7 +3,7 @@ wb = xlsx_package.workbook wb.add_worksheet(name: 'registrations') do |sheet| bold_style = wb.styles.add_style(b: true) - row = ['Attended', 'Name', 'Nickname', 'Affilιation', 'Email', 'Arrival', 'Departure'] + row = ['Attended', 'Name', 'Nickname', 'Affilιation', 'Email'] @conference.questions.each do |question| row << question.title @@ -18,8 +18,6 @@ wb.add_worksheet(name: 'registrations') do |sheet| row << registration.nickname row << registration.affiliation row << registration.email - row << registration.arrival.to_s - row << registration.departure.to_s @conference.questions.each do |question| qa = registration.qanswers.find_by(question: question) answer = ( qa ? qa.answer.title : '' ) @@ -30,4 +28,3 @@ wb.add_worksheet(name: 'registrations') do |sheet| sheet.add_row row end end - diff --git a/app/views/conference_registrations/_registration_info.html.haml b/app/views/conference_registrations/_registration_info.html.haml index a81f385d..5fdd9bf4 100644 --- a/app/views/conference_registrations/_registration_info.html.haml +++ b/app/views/conference_registrations/_registration_info.html.haml @@ -24,10 +24,4 @@ (Scheduled on: #{event.time.to_date}) %br - - -= f.inputs 'Your Travel Info' do - = f.input :arrival, as: :string, label: 'Your arrival time', hint: "Leave blank if not sure", input_html: { value: (f.object.arrival.to_formatted_s(:db_without_seconds) unless f.object.arrival.nil?), id: 'registration-arrival-datepicker',start_date: @conference.start_date,end_date: @conference.end_date } - = f.input :departure, as: :string, label: 'Your departure time', hint: "Leave blank if not sure", input_html: { value: (f.object.departure.to_formatted_s(:db_without_seconds) unless f.object.departure.nil?), id: 'registration-departure-datepicker' } - = render 'conferences/code_of_conduct', organization: @conference.organization diff --git a/app/views/conference_registrations/show.html.haml b/app/views/conference_registrations/show.html.haml index afb5b9e0..d060e412 100644 --- a/app/views/conference_registrations/show.html.haml +++ b/app/views/conference_registrations/show.html.haml @@ -33,28 +33,6 @@ data: { toggle: 'modal', target: '#modal-code-of-conduct'} = render 'conferences/code_of_conduct', organization: @conference.organization - .row - .col-md-12 - %h4 - %span.fa-stack - %i.fa.fa-square-o.fa-stack-2x - %i.fa.fa-plane.fa-stack-1x - Travel Schedule - %ul - %li - - if @registration.arrival.present? - arrive at - %strong - = @registration.arrival.strftime('%A, %B %-d. %Y %H:%M') - - else - You haven't scheduled your arrival - %li - - if @registration.departure.present? - depart at - %strong - = @registration.departure.strftime('%A, %B %-d. %Y %H:%M') - - else - You haven't scheduled your departure - if @conference.surveys.for_registration.any? .row .col-md-12 diff --git a/db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb b/db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb new file mode 100644 index 00000000..18f1398d --- /dev/null +++ b/db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb @@ -0,0 +1,6 @@ +class RemoveArrivalDepartureFromRegistrations < ActiveRecord::Migration[5.0] + def change + remove_column :registrations, :arrival, :datetime + remove_column :registrations, :departure, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 2cb9ac88..2ad25c7e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20181113195810) do +ActiveRecord::Schema.define(version: 20181229233811) do create_table "answers", force: :cascade do |t| t.string "title" @@ -364,8 +364,6 @@ ActiveRecord::Schema.define(version: 20181113195810) do create_table "registrations", force: :cascade do |t| t.integer "conference_id" - t.datetime "arrival" - t.datetime "departure" t.datetime "created_at" t.datetime "updated_at" t.text "other_special_needs" diff --git a/spec/controllers/conference_registration_controller_spec.rb b/spec/controllers/conference_registration_controller_spec.rb index f2849c27..964acaac 100644 --- a/spec/controllers/conference_registration_controller_spec.rb +++ b/spec/controllers/conference_registration_controller_spec.rb @@ -290,14 +290,15 @@ describe ConferenceRegistrationsController, type: :controller do before do @registration = create(:registration, conference: conference, - user: user, - arrival: Date.new(2014, 04, 25)) + user: user) end context 'updates successfully' do before do - patch :update, params: { registration: attributes_for(:registration, arrival: Date.new(2014, 04, 29)), - conference_id: conference.short_title } + patch :update, params: { + registration: attributes_for(:registration, volunteer: true), + conference_id: conference.short_title + } end it 'redirects to registration show path' do @@ -309,16 +310,17 @@ describe ConferenceRegistrationsController, type: :controller do end it 'updates the registration' do - @registration.reload - expect(@registration.arrival).to eq Date.new(2014, 04, 29) + expect{ @registration.reload }.to change(@registration, :updated_at) end end context 'update fails' do before do allow_any_instance_of(Registration).to receive(:update_attributes).and_return(false) - patch :update, params: { registration: attributes_for(:registration, arrival: Date.new(2014, 04, 27)), - conference_id: conference.short_title } + patch :update, params: { + registration: attributes_for(:registration, volunteer: true), + conference_id: conference.short_title + } end it 'renders edit template' do @@ -331,7 +333,7 @@ describe ConferenceRegistrationsController, type: :controller do it 'does not update the registration' do @registration.reload - expect(@registration.arrival).to eq Date.new(2014, 04, 25) + expect { @registration.reload }.not_to change(@registration, :updated_at) end end end diff --git a/spec/models/registration_spec.rb b/spec/models/registration_spec.rb index 9f710416..d6c86838 100644 --- a/spec/models/registration_spec.rb +++ b/spec/models/registration_spec.rb @@ -51,26 +51,4 @@ describe Registration do expect(subject).to receive(:send_registration_mail) end end - - describe 'registration_to_events_only_if_present' do - context 'valid' do - it 'when user registers for events happening while user is at the conference' do - registration.arrival = conference.start_date - registration.departure = conference.end_date - registration.events << create(:event, program: conference.program, start_time: conference.end_date) - - expect(registration.valid?).to eq true - end - end - - context 'invalid' do - it 'when user registers for events happening while user is not at the conference' do - registration.arrival = conference.start_date - registration.departure = conference.start_date - registration.events << create(:event, program: conference.program, start_time: conference.end_date) - - expect(registration.valid?).to eq false - end - end - end end From 5441f83271328c31f3029d8ec1912eab71d23fa0 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 01:27:10 -0800 Subject: [PATCH 03/61] No mysql for SnapCon --- Gemfile | 2 +- Gemfile.lock | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index b281e1aa..eaed74bb 100644 --- a/Gemfile +++ b/Gemfile @@ -20,7 +20,7 @@ gem 'puma', '~> 3.0' gem 'responders', '~> 2.0' # as supported databases -gem 'mysql2' +# gem 'mysql2' gem 'pg' # for tracking data changes diff --git a/Gemfile.lock b/Gemfile.lock index cd7d3f95..5cda6ab7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -304,7 +304,6 @@ GEM multi_json (1.13.1) multi_xml (0.6.0) multipart-post (2.1.1) - mysql2 (0.5.2) nenv (0.3.0) net-http-persistent (3.0.1) connection_pool (~> 2.2) @@ -665,7 +664,6 @@ DEPENDENCIES mina mini_magick money-rails - mysql2 nokogiri (>= 1.8.1) omniauth omniauth-facebook From de7a6036d1ea7fc87c0d95778beed7588aceb74d Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 01:32:16 -0800 Subject: [PATCH 04/61] Tweak the top heading if there is a image --- app/views/conferences/_header.haml | 6 ++--- app/views/conferences/show.html.haml | 36 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index c3a75bbc..85c430e1 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -1,11 +1,11 @@ - cache [conference, venue, '#splash#header'] do - #banner + #banner(style: "background_image: url('#{conference.picture_url})'") .container .row .col-md-8.col-md-offset-2#header .row - .col-md-4 - - if conference.picture? + - if conference.picture? + .col-md-4 = image_tag(conference.picture_url, class: 'img-responsive img-center', id: 'splash-logo') diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index e8f64db3..001794de 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -64,21 +64,21 @@ = render 'social_media', contact: @conference.contact = render 'footer' -- content_for :script_head do - :javascript - var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic(); - var triangle_colors = triangle_tcs.map(function(t) { - return t.toHexString(); - }); - $(function () { - $(document).ready(function() { - var triangle_width = document.body.clientWidth; - var triangle_height = ($( "#banner" ).height() + 200 ); - var pattern = Trianglify({ width: triangle_width, - height: triangle_height, - cell_size: 100, - x_colors: triangle_colors - }); - $('#banner').css('background-image', 'url("' + pattern.png() + '")'); - }); - }); +-# - content_for :script_head do +-# :javascript +-# var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic(); +-# var triangle_colors = triangle_tcs.map(function(t) { +-# return t.toHexString(); +-# }); +-# $(function () { +-# $(document).ready(function() { +-# var triangle_width = document.body.clientWidth; +-# var triangle_height = ($( "#banner" ).height() + 200 ); +-# var pattern = Trianglify({ width: triangle_width, +-# height: triangle_height, +-# cell_size: 100, +-# x_colors: triangle_colors +-# }); +-# $('#banner').css('background-image', 'url("' + pattern.png() + '")'); +-# }); +-# }); From 7657ddf27f093ad62ca9e974b08c73bbaa2829b7 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 01:41:01 -0800 Subject: [PATCH 05/61] attempt to fix style syntax --- app/views/conferences/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index 001794de..becddfb8 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -63,7 +63,7 @@ - if @conference.contact.has_social_media? = render 'social_media', contact: @conference.contact = render 'footer' - +) -# - content_for :script_head do -# :javascript -# var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic(); From ccc9e9c98ed12c401bb6543b7545c5ce87177598 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 01:51:15 -0800 Subject: [PATCH 06/61] Try 3 for the image background --- app/views/conferences/_header.haml | 2 +- app/views/conferences/show.html.haml | 37 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index 85c430e1..dbf4de08 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -1,5 +1,5 @@ - cache [conference, venue, '#splash#header'] do - #banner(style: "background_image: url('#{conference.picture_url})'") + #banner .container .row .col-md-8.col-md-offset-2#header diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index becddfb8..883b75d2 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -64,21 +64,22 @@ = render 'social_media', contact: @conference.contact = render 'footer' ) --# - content_for :script_head do --# :javascript --# var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic(); --# var triangle_colors = triangle_tcs.map(function(t) { --# return t.toHexString(); --# }); --# $(function () { --# $(document).ready(function() { --# var triangle_width = document.body.clientWidth; --# var triangle_height = ($( "#banner" ).height() + 200 ); --# var pattern = Trianglify({ width: triangle_width, --# height: triangle_height, --# cell_size: 100, --# x_colors: triangle_colors --# }); --# $('#banner').css('background-image', 'url("' + pattern.png() + '")'); --# }); --# }); + +- content_for :script_head do + :javascript + var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic(); + var triangle_colors = triangle_tcs.map(function(t) { + return t.toHexString(); + }); + $(function () { + $(document).ready(function() { + var triangle_width = document.body.clientWidth; + var triangle_height = ($( "#banner" ).height() + 200 ); + var pattern = Trianglify({ width: triangle_width, + height: triangle_height, + cell_size: 100, + x_colors: triangle_colors + }); + $('#banner').css('background-image', "'url(\"#{@conference.picture_url\")'"); + }); + }); From 94168ec23e12c4884767f099ae39dea6d0492939 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 01:59:42 -0800 Subject: [PATCH 07/61] JS conf picture URL try 2 --- app/views/conferences/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index 883b75d2..ba8ca711 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -80,6 +80,6 @@ cell_size: 100, x_colors: triangle_colors }); - $('#banner').css('background-image', "'url(\"#{@conference.picture_url\")'"); + $('#banner').css('background-image', "'url(#{@conference.picture_url)'"); }); }); From 9a21d4016d27f87773a6275b8b5ee755cf81f30d Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 02:18:44 -0800 Subject: [PATCH 08/61] try again for picture_url --- app/views/conferences/_header.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index dbf4de08..f4b902ab 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -1,5 +1,5 @@ - cache [conference, venue, '#splash#header'] do - #banner + #banner{ style: ("background-image: url(#{conference.picture_url})" if conference.picture_url) } .container .row .col-md-8.col-md-offset-2#header From beb1b8ae26378b25e9dd39a2d83abf8c273f6417 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 02:48:47 -0800 Subject: [PATCH 09/61] ugh fix js again --- app/views/conferences/show.html.haml | 36 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index ba8ca711..d8d53f40 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -65,21 +65,21 @@ = render 'footer' ) -- content_for :script_head do - :javascript - var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic(); - var triangle_colors = triangle_tcs.map(function(t) { - return t.toHexString(); - }); - $(function () { - $(document).ready(function() { - var triangle_width = document.body.clientWidth; - var triangle_height = ($( "#banner" ).height() + 200 ); - var pattern = Trianglify({ width: triangle_width, - height: triangle_height, - cell_size: 100, - x_colors: triangle_colors - }); - $('#banner').css('background-image', "'url(#{@conference.picture_url)'"); - }); - }); +-# - content_for :script_head do +-# :javascript +-# var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic(); +-# var triangle_colors = triangle_tcs.map(function(t) { +-# return t.toHexString(); +-# }); +-# $(function () { +-# $(document).ready(function() { +-# var triangle_width = document.body.clientWidth; +-# var triangle_height = ($( "#banner" ).height() + 200 ); +-# var pattern = Trianglify({ width: triangle_width, +-# height: triangle_height, +-# cell_size: 100, +-# x_colors: triangle_colors +-# }); +-# $('#banner').css('background-image', 'url(' + 0 + ')'); +-# }); +-# }); From 8d6c9978b967e07d195b7f1b308b1fd2251ccd54 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 03:15:05 -0800 Subject: [PATCH 10/61] Hide the small image for now --- app/views/conferences/_header.haml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index f4b902ab..025009aa 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -4,12 +4,12 @@ .row .col-md-8.col-md-offset-2#header .row - - if conference.picture? - .col-md-4 - = image_tag(conference.picture_url, - class: 'img-responsive img-center', - id: 'splash-logo') - .col-md-8 + -# - if conference.picture? + -# .col-md-4 + -# = image_tag(conference.picture_url, + -# class: 'img-responsive img-center', + -# id: 'splash-logo') + .col-md-8.col-md-offset-2 %h1 = conference.title %h3 From 34e32580867e7b096a3b15ddd490e4acba5912bf Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 11:28:40 -0800 Subject: [PATCH 11/61] attempt to fix groupby issue --- app/datatables/user_datatable.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb index ab0e877f..2d5f22c8 100644 --- a/app/datatables/user_datatable.rb +++ b/app/datatables/user_datatable.rb @@ -42,8 +42,8 @@ class UserDatatable < AjaxDatatablesRails::Base def get_raw_records User.left_outer_joins(:registrations, :roles) .distinct - .select("users.*, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count") - .group('users.id') + .select("users.id, users.name, users.email, users.confirmed_at COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count") + .group('users.id, users.name, users.email, users.confirmed_at') end # rubocop:enable Naming/AccessorMethodName From e7a8190302aed8479b68252566f827b350627661 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 12:21:05 -0800 Subject: [PATCH 12/61] Revert "Update rails-assets-bootstrap-select to version 1.13.10" --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ed184bf3..a148de60 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -397,16 +397,16 @@ GEM bundler (>= 1.3.0) railties (= 5.2.3) sprockets-rails (>= 2.0.0) - rails-assets-bootstrap (3.4.1) - rails-assets-jquery (>= 1.9.1, < 4) + rails-assets-bootstrap (3.3.6) + rails-assets-jquery (>= 1.9.1, < 3) rails-assets-bootstrap-markdown (2.10.0) rails-assets-bootstrap (~> 3) - rails-assets-bootstrap-select (1.13.10) + rails-assets-bootstrap-select (1.13.3) rails-assets-bootstrap (>= 3.0.0) rails-assets-jquery (>= 1.9.1, < 4) rails-assets-date.format (1.2.3) rails-assets-holderjs (2.9.6) - rails-assets-jquery (3.4.1) + rails-assets-jquery (2.2.4) rails-assets-jquery-smooth-scroll (2.2.0) rails-assets-jquery (>= 1.7.0) rails-assets-markdown (0.5.0) From 2c1b11d2c7c74c0e961b22f7c6ec3df03613f2ab Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 12:25:13 -0800 Subject: [PATCH 13/61] Fix a comma --- app/datatables/user_datatable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb index 2d5f22c8..a1dcb3cf 100644 --- a/app/datatables/user_datatable.rb +++ b/app/datatables/user_datatable.rb @@ -42,7 +42,7 @@ class UserDatatable < AjaxDatatablesRails::Base def get_raw_records User.left_outer_joins(:registrations, :roles) .distinct - .select("users.id, users.name, users.email, users.confirmed_at COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count") + .select("users.id, users.name, users.email, users.confirmed_at, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count") .group('users.id, users.name, users.email, users.confirmed_at') end # rubocop:enable Naming/AccessorMethodName From dbe0b1c09c2b00f977e1307d0ed22083274b92c4 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 12:45:41 -0800 Subject: [PATCH 14/61] try again with the query --- app/datatables/user_datatable.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb index a1dcb3cf..20a9a21c 100644 --- a/app/datatables/user_datatable.rb +++ b/app/datatables/user_datatable.rb @@ -42,8 +42,8 @@ class UserDatatable < AjaxDatatablesRails::Base def get_raw_records User.left_outer_joins(:registrations, :roles) .distinct - .select("users.id, users.name, users.email, users.confirmed_at, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count") - .group('users.id, users.name, users.email, users.confirmed_at') + .select("users.*, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count") + # .group('users.id, users.name, users.email, users.confirmed_at') end # rubocop:enable Naming/AccessorMethodName From 29f6a41c9880e06c5c6a77b199ccf05e9daf6b27 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 17 Dec 2019 12:56:51 -0800 Subject: [PATCH 15/61] Not ruby-ish but this should work --- app/datatables/user_datatable.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb index 20a9a21c..0f0bdc16 100644 --- a/app/datatables/user_datatable.rb +++ b/app/datatables/user_datatable.rb @@ -40,10 +40,11 @@ class UserDatatable < AjaxDatatablesRails::Base # rubocop:disable Naming/AccessorMethodName def get_raw_records - User.left_outer_joins(:registrations, :roles) - .distinct - .select("users.*, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count") - # .group('users.id, users.name, users.email, users.confirmed_at') + User.left_outer_joins(:registrations, :roles).distinct.select( + "users.*, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count" + ).group( + 'users.id, users.name, users.email, users.confirmed_at' + ) end # rubocop:enable Naming/AccessorMethodName From cdcf550ee08c61a7baf438fa307c82d1ac6f4015 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 01:13:58 -0800 Subject: [PATCH 16/61] more attempts to make datatables work --- app/datatables/user_datatable.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb index 0f0bdc16..574a3636 100644 --- a/app/datatables/user_datatable.rb +++ b/app/datatables/user_datatable.rb @@ -40,16 +40,17 @@ class UserDatatable < AjaxDatatablesRails::Base # rubocop:disable Naming/AccessorMethodName def get_raw_records - User.left_outer_joins(:registrations, :roles).distinct.select( - "users.*, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count" - ).group( - 'users.id, users.name, users.email, users.confirmed_at' + User.left_outer_joins(:registrations, :roles).select( + "DISTINCT users.id, users.name, users.email, users.confirmed_at, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count" ) + # .group( + # 'users.id, users.name, users.email, users.confirmed_at' + # ) end # rubocop:enable Naming/AccessorMethodName def records_total_count - fetch_records.unscope(:group).count(:all) + fetch_records.unscoped.count(:id) end def records_filtered_count From 20129e2e77e91f08fad839cb19d9af63c0978f94 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 01:23:54 -0800 Subject: [PATCH 17/61] readd back the group by --- app/datatables/user_datatable.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb index 574a3636..af3ab302 100644 --- a/app/datatables/user_datatable.rb +++ b/app/datatables/user_datatable.rb @@ -42,10 +42,9 @@ class UserDatatable < AjaxDatatablesRails::Base def get_raw_records User.left_outer_joins(:registrations, :roles).select( "DISTINCT users.id, users.name, users.email, users.confirmed_at, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count" + ).group( + 'users.id, users.name, users.email, users.confirmed_at' ) - # .group( - # 'users.id, users.name, users.email, users.confirmed_at' - # ) end # rubocop:enable Naming/AccessorMethodName From 624ee6cf6eb8b815c8fec2e20ffa6d4b094e6e0e Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 01:29:17 -0800 Subject: [PATCH 18/61] attempt one more fix --- app/datatables/user_datatable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb index af3ab302..a01e7e12 100644 --- a/app/datatables/user_datatable.rb +++ b/app/datatables/user_datatable.rb @@ -53,7 +53,7 @@ class UserDatatable < AjaxDatatablesRails::Base end def records_filtered_count - filter_records(fetch_records).unscope(:group).count(:all) + filter_records(fetch_records).unscoped.count end # ==== These methods represent the basic operations to perform on records From 78394bb0d325849225df66d0ca3a2cba0c76d025 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 01:41:17 -0800 Subject: [PATCH 19/61] Delete some unnecessary files --- app/models/.gitkeep | 0 app/models/.lodging.rb.swp | Bin 12288 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/models/.gitkeep delete mode 100644 app/models/.lodging.rb.swp diff --git a/app/models/.gitkeep b/app/models/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/models/.lodging.rb.swp b/app/models/.lodging.rb.swp deleted file mode 100644 index 70c3567d044a786937564daf3a40831edad2d636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&&uSDg90%~MSMd+}0RFVl)3URxpk?slQBWvqdr=A5ncvO^vPnoX9+cY0=*gqL zhR>qZgHKU^V@FUA6?&1vH}EApll+qKxec4;eE;!N+LuvELe56tovmZGH)sqW3>q_yIi@@cGh>Zv^;YO3_<_`=N7o4 z?%iF?hw`mEx9R4My>qXGLI^+r0uX=z1Rwwb2teTC36wZdhjQ#o-+!fHKo2tK1)7HK1yClo=X;z zx#as;cRbXhK>z{}fB*y_009U<00Izz00jQG0Q*)EZ9?yh?xPE)u4e;U6Qem zZ0AFg@t1WUhtgJ?@>=%cVrqIvP4FvD!xGxIvgsesbTDkXWEXswbqT)@tHzm}>B;Hk nd3s2XVsy4K#RmV3n~>z|ev4Kqyk)O*NpizpJ6kvzHy-u}!y1e& From 43b65cc5094f96d57c6705cd02ec5db504603560 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 01:45:04 -0800 Subject: [PATCH 20/61] Enable a bunch more markdown options. Allow Snap_!_ to be rendered right. --- app/helpers/format_helper.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/helpers/format_helper.rb b/app/helpers/format_helper.rb index b0691518..9289b79c 100644 --- a/app/helpers/format_helper.rb +++ b/app/helpers/format_helper.rb @@ -191,9 +191,12 @@ module FormatHelper return '' if text.nil? options = { - autolink: true, + autolink: true, space_after_headers: true, - no_intra_emphasis: true + tables: true, + strikethrough: true, + footnotes: true, + superscript: true } markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new(escape_html: escape_html), options) markdown.render(text).html_safe From cd2e2066f424f00433274ec25e8d771920b10d3a Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 02:00:32 -0800 Subject: [PATCH 21/61] Tweak some wording, html and descriptions for Snap!Con --- app/views/conferences/_call_for_content.haml | 2 +- app/views/conferences/_header.haml | 2 +- app/views/layouts/_navigation.html.haml | 1 + app/views/layouts/application.html.haml | 10 +++++----- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/views/conferences/_call_for_content.haml b/app/views/conferences/_call_for_content.haml index 8287e911..6fab5dc6 100644 --- a/app/views/conferences/_call_for_content.haml +++ b/app/views/conferences/_call_for_content.haml @@ -1,6 +1,6 @@ = content_for :splash_nav do %li - %a.smoothscroll{ href: '#call' } Call For Content + %a.smoothscroll{ href: '#call' } Call For Participation %section#call .container diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index 025009aa..23d6b4eb 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -11,7 +11,7 @@ -# id: 'splash-logo') .col-md-8.col-md-offset-2 %h1 - = conference.title + = conference.title.html_safe %h3 - if conference.start_date && conference.end_date %span.date.text-nowrap diff --git a/app/views/layouts/_navigation.html.haml b/app/views/layouts/_navigation.html.haml index deea4f09..e4be6e15 100644 --- a/app/views/layouts/_navigation.html.haml +++ b/app/views/layouts/_navigation.html.haml @@ -61,6 +61,7 @@ %small %label{for: 'user_remember_me'} Remember me = check_box_tag 'user[remember_me]' + %br %button.btn.btn-success.btn-block Sign in - unless omniauth_configured.empty? .divider diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index d4c194b9..d333a54d 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,10 +1,10 @@ -%html{xmlns: 'http://www.w3.org/1999/html'} +%html{lang: 'en'} %head %meta{charset: 'utf-8'} - %meta{name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1'} + %meta{name: 'viewport', content: 'width=device-width, initial-scale=1'} %title= content_for?(:title) ? yield(:title) : (ENV['OSEM_NAME'] || 'OSEM') - %meta{content: '', name: 'description'} - %meta{content: '', name: 'author'} + %meta{content: 'Snap!Con -- A conference all about Snap!, a programing language from UC Berkeley.', name: 'description'} + %meta{content: 'Michael Ball, Brian Harvey, Jens Moenig, Bernat Romagosa, Dan Garcia, Lauren Mock', name: 'author'} = stylesheet_link_tag "application", media: 'all' = javascript_include_tag "application" @@ -45,7 +45,7 @@ #{link_to "MIT license", "http://opensource.org/licenses/MIT"}. You can run, copy, distribute, study, change and improve it. The source code and the developers are on - #{link_to "GitHub", "https://github.com/openSUSE/osem"}. + #{link_to "GitHub", "https://github.com/snap-cloud/snapcon"}. This site is a modification of #{link_to "OSEM", "https://github.com/openSUSE/osem"}. - if ENV["SKYLIGHT_PUBLIC_DASHBOARD_URL"].present? Performance data is available on #{link_to "Skylight", ENV["SKYLIGHT_PUBLIC_DASHBOARD_URL"]}. From 5b5e10ba5023d98637d0234fb3eb34a834554331 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 02:12:44 -0800 Subject: [PATCH 22/61] More wording tweaks --- app/views/conferences/_call_for_papers.haml | 2 +- app/views/conferences/_program.haml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/conferences/_call_for_papers.haml b/app/views/conferences/_call_for_papers.haml index 4847a992..d0d513ff 100644 --- a/app/views/conferences/_call_for_papers.haml +++ b/app/views/conferences/_call_for_papers.haml @@ -2,7 +2,7 @@ expires_in: 1.hour) do .col-md-4.col-sm-4.text-center %h2 - Call for Papers + Call for Participation %p.lead We are now accepting proposals for sessions! %p diff --git a/app/views/conferences/_program.haml b/app/views/conferences/_program.haml index 2ab2ef70..3789f8a2 100644 --- a/app/views/conferences/_program.haml +++ b/app/views/conferences/_program.haml @@ -9,8 +9,8 @@ .col-md-12 %p.lead.text-center %span.notranslate - = conference.title - has the most awesome program ever! + = conference.title.html_safe + will have an enaging program! - unless highlights.blank? = render 'highlights', conference_id: conference.short_title, From 767b0bcd19b0efd3fc5514666f8826257c01aebc Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 02:21:09 -0800 Subject: [PATCH 23/61] BJC-ify a bunch of styles --- app/assets/stylesheets/osem-splash.scss | 17 ++++++++--------- app/assets/stylesheets/osem.scss | 2 +- app/assets/stylesheets/strap-on.scss | 6 +++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/assets/stylesheets/osem-splash.scss b/app/assets/stylesheets/osem-splash.scss index ce0418d6..4b26d6a2 100644 --- a/app/assets/stylesheets/osem-splash.scss +++ b/app/assets/stylesheets/osem-splash.scss @@ -117,13 +117,12 @@ #social-media{ background: none repeat scroll 0 0 #2f2f2f; - padding-top: 60px; - padding-bottom: 60px; + padding: 30px 20px; i{ - color: #4a4a4a; + color: #0C3559; } i:hover{ - color: #16a085; + color: #F2E205; } a{ padding-left: 100px; @@ -164,11 +163,11 @@ i.fa { line-height: inherit; } - &.show { - visibility:visible; - cursor:pointer; - opacity: 1.0; - } + // &.show { + // visibility:visible; + // cursor:pointer; + // opacity: 1.0; + // } a { color: white; } diff --git a/app/assets/stylesheets/osem.scss b/app/assets/stylesheets/osem.scss index 04da1a37..f4b0f8ed 100644 --- a/app/assets/stylesheets/osem.scss +++ b/app/assets/stylesheets/osem.scss @@ -13,7 +13,7 @@ body { } #content { - padding-bottom: 60px; + // padding-bottom: 60px; } #footer { diff --git a/app/assets/stylesheets/strap-on.scss b/app/assets/stylesheets/strap-on.scss index 571161e6..da70029d 100644 --- a/app/assets/stylesheets/strap-on.scss +++ b/app/assets/stylesheets/strap-on.scss @@ -1,9 +1,9 @@ -$navbar-default-bg: #299a0b; -$navbar-default-link-active-bg: #DFE0DF; +$navbar-default-bg: #0C3559; +$navbar-default-link-active-bg: rgb(8,8,8); $navbar-default-border: 1px solid #d4d4d4; $navbar-default-color: #ffffff; $navbar-default-link-color: #ffffff; -$navbar-default-link-hover-color: #000000; +$navbar-default-link-hover-color: #F2E205; @import 'bootstrap-datetimepicker'; @import "bootstrap-sprockets"; From 904ca19878088a59984f884f2a9a47abeb0a8c29 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 02:32:18 -0800 Subject: [PATCH 24/61] More CSS-y things --- app/assets/stylesheets/osem-navbar.scss | 4 +++- app/assets/stylesheets/osem-splash.scss | 6 +++--- app/assets/stylesheets/osem.scss | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/osem-navbar.scss b/app/assets/stylesheets/osem-navbar.scss index 011ebc89..c64a15e6 100644 --- a/app/assets/stylesheets/osem-navbar.scss +++ b/app/assets/stylesheets/osem-navbar.scss @@ -29,7 +29,9 @@ } } .dropdown-menu { - padding: 17px; min-width: 225px; } + .navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:hover, .navbar-default .navbar-nav>.open>a:focus { + color: #FFF; + } } diff --git a/app/assets/stylesheets/osem-splash.scss b/app/assets/stylesheets/osem-splash.scss index 4b26d6a2..a1c29c0c 100644 --- a/app/assets/stylesheets/osem-splash.scss +++ b/app/assets/stylesheets/osem-splash.scss @@ -116,10 +116,10 @@ } #social-media{ - background: none repeat scroll 0 0 #2f2f2f; - padding: 30px 20px; + background: none repeat scroll 0 0 #0C3559; + padding: 50px 20px; i{ - color: #0C3559; + color: #FFF; } i:hover{ color: #F2E205; diff --git a/app/assets/stylesheets/osem.scss b/app/assets/stylesheets/osem.scss index f4b0f8ed..c48be11d 100644 --- a/app/assets/stylesheets/osem.scss +++ b/app/assets/stylesheets/osem.scss @@ -13,7 +13,7 @@ body { } #content { - // padding-bottom: 60px; + padding-bottom: 45px; } #footer { From 8a35bb377efd1bc3f7f7902a4f0f82ad9ea1197d Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 02:36:42 -0800 Subject: [PATCH 25/61] Minor HTML cleanup --- .../conferences/_conference_details.html.haml | 2 +- app/views/conferences/_footer.haml | 26 +++++++++---------- app/views/conferences/show.html.haml | 2 +- app/views/layouts/application.html.haml | 4 +-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/views/conferences/_conference_details.html.haml b/app/views/conferences/_conference_details.html.haml index 08b73023..02e54c29 100644 --- a/app/views/conferences/_conference_details.html.haml +++ b/app/views/conferences/_conference_details.html.haml @@ -6,7 +6,7 @@ = image_tag(conference.picture_url, class: 'img-responsive') if conference.picture? .col-md-6 %h3 - = conference.title + = conference.title.html_safe %small %b = date_string(conference.start_date, conference.end_date) diff --git a/app/views/conferences/_footer.haml b/app/views/conferences/_footer.haml index 5b24fd92..6b66478a 100644 --- a/app/views/conferences/_footer.haml +++ b/app/views/conferences/_footer.haml @@ -1,14 +1,14 @@ -.scroll-top-wrapper - = link_to "#banner", class: "smoothscroll" do - %i.fa.fa-2x.fa-arrow-circle-up +-# .scroll-top-wrapper +-# = link_to "#banner", class: "smoothscroll" do +-# %i.fa.fa-2x.fa-arrow-circle-up -:javascript - $(function(){ - $(document).on( 'scroll', function(){ - if ($(window).scrollTop() > 100) { - $('.scroll-top-wrapper').addClass('show'); - } else { - $('.scroll-top-wrapper').removeClass('show'); - } - }); - }); +-# :javascript +-# $(function(){ +-# $(document).on( 'scroll', function(){ +-# if ($(window).scrollTop() > 100) { +-# $('.scroll-top-wrapper').addClass('show'); +-# } else { +-# $('.scroll-top-wrapper').removeClass('show'); +-# } +-# }); +-# }); diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index d8d53f40..c478a8a2 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -63,7 +63,7 @@ - if @conference.contact.has_social_media? = render 'social_media', contact: @conference.contact = render 'footer' -) + -# - content_for :script_head do -# :javascript diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index d333a54d..86eafac9 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -2,7 +2,7 @@ %head %meta{charset: 'utf-8'} %meta{name: 'viewport', content: 'width=device-width, initial-scale=1'} - %title= content_for?(:title) ? yield(:title) : (ENV['OSEM_NAME'] || 'OSEM') + %title= content_for?(:title) ? strip_tags( yield(:title) ) : (ENV['OSEM_NAME'] || 'OSEM') %meta{content: 'Snap!Con -- A conference all about Snap!, a programing language from UC Berkeley.', name: 'description'} %meta{content: 'Michael Ball, Brian Harvey, Jens Moenig, Bernat Romagosa, Dan Garcia, Lauren Mock', name: 'author'} = stylesheet_link_tag "application", media: 'all' @@ -26,7 +26,7 @@ -# Admin area - if controller.class.name.split("::").first=="Admin" = render 'layouts/admin' - -else + - else #messages .container = render 'layouts/messages' From 4d4bdd00c6178caf7b94bc1e4f476def6024f82f Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 03:06:12 -0800 Subject: [PATCH 26/61] Work on omniauth setup --- Gemfile | 7 +-- Gemfile.lock | 18 ++----- .../devise/shared/_openid_links.html.haml | 15 ++++-- .../shared/_sign_in_form_embedded.html.haml | 49 ++++++++++--------- config/initializers/devise.rb | 10 ++-- 5 files changed, 49 insertions(+), 50 deletions(-) diff --git a/Gemfile b/Gemfile index eaed74bb..099ada92 100644 --- a/Gemfile +++ b/Gemfile @@ -40,10 +40,11 @@ gem 'devise_ichain_authenticatable' # for openID authentication gem 'omniauth' -gem 'omniauth-facebook' -gem 'omniauth-github' +# gem 'omniauth-facebook' +# gem 'omniauth-github' gem 'omniauth-google-oauth2' -gem 'omniauth-openid' +# gem 'omniauth-openid' +gem 'omniauth-discourse' # Bot-filtering gem 'recaptcha', require: 'recaptcha/rails' diff --git a/Gemfile.lock b/Gemfile.lock index a148de60..43c4c302 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -323,11 +323,8 @@ GEM omniauth (1.9.0) hashie (>= 3.4.6, < 3.7.0) rack (>= 1.6.2, < 3) - omniauth-facebook (5.0.0) - omniauth-oauth2 (~> 1.2) - omniauth-github (1.3.0) - omniauth (~> 1.5) - omniauth-oauth2 (>= 1.4.0, < 2.0) + omniauth-discourse (1.0.0) + omniauth (~> 1.0) omniauth-google-oauth2 (0.6.1) jwt (>= 2.0) omniauth (>= 1.1.1) @@ -335,9 +332,6 @@ GEM omniauth-oauth2 (1.6.0) oauth2 (~> 1.1) omniauth (~> 1.9) - omniauth-openid (1.0.1) - omniauth (~> 1.0) - rack-openid (~> 1.3.1) open4 (1.3.4) orm_adapter (0.5.0) paper_trail (10.3.1) @@ -379,9 +373,6 @@ GEM public_suffix (3.1.1) puma (3.12.2) rack (2.0.7) - rack-openid (1.3.1) - rack (>= 1.1.0) - ruby-openid (>= 2.1.8) rack-test (1.1.0) rack (>= 1.0, < 3) rails (5.2.3) @@ -498,7 +489,6 @@ GEM rubocop-rspec (1.36.0) rubocop (>= 0.68.1) ruby-oembed (0.12.0) - ruby-openid (2.9.2) ruby-progressbar (1.10.1) ruby-rc4 (0.1.5) ruby_dep (1.5.0) @@ -666,10 +656,8 @@ DEPENDENCIES money-rails nokogiri (>= 1.8.1) omniauth - omniauth-facebook - omniauth-github + omniauth-discourse omniauth-google-oauth2 - omniauth-openid paper_trail pdf-inspector pg diff --git a/app/views/devise/shared/_openid_links.html.haml b/app/views/devise/shared/_openid_links.html.haml index 09c7a7ea..19adf922 100644 --- a/app/views/devise/shared/_openid_links.html.haml +++ b/app/views/devise/shared/_openid_links.html.haml @@ -1,7 +1,14 @@ .text-center .btn-group.btn-group-lg#openid-btn-grp - omniauth_configured.each do |provider| - = link_to "user_#{provider}_omniauth_authorize".to_sym, class: "btn btn-success btn-lg", - id: "omniauth-#{provider}", - title: "Your #{provider} login" do - %i{class: "fa fa-#{provider}"} + - if provider == :discourse + = link_to "user_#{provider}_omniauth_authorize".to_sym, class: "btn btn-success btn-lg", + id: "omniauth-#{provider}", + title: "Your #{provider} login" do + %i{class: "fa fa-#{provider}"} + - else + = link_to("Snap! Account", + "user_#{provider}_omniauth_authorize".to_sym, + class: "btn btn-success btn-lg", + id: "omniauth-#{provider}", + title: "Your #{provider} login") diff --git a/app/views/devise/shared/_sign_in_form_embedded.html.haml b/app/views/devise/shared/_sign_in_form_embedded.html.haml index 362fc695..dc719616 100644 --- a/app/views/devise/shared/_sign_in_form_embedded.html.haml +++ b/app/views/devise/shared/_sign_in_form_embedded.html.haml @@ -1,25 +1,26 @@ - if ENV['OSEM_ICHAIN_ENABLED'] != 'true' - = form_tag(new_user_session_path, class: 'form-horizontal') do - %legend - %span - Sign In - .form-group - %label{for: "user[login]", class: 'col-sm-2 control-label'} - Username - .col-sm-10 - = text_field_tag 'user[login]', nil, placeholder: 'Username', class: 'form-control', required: 'required' - .form-group - %label{for: "user[password]", class: 'col-sm-2 control-label'} - Password - .col-sm-10 - = password_field_tag 'user[password]', nil, placeholder: 'Password', class: 'form-control', required: 'required' - .form-group - .col-sm-12 - %button.btn.btn-success.pull-right - Sign in - = render partial: 'devise/shared/openid' - %p.text-right - %a.small.btn.btn-default{"data-toggle" => "collapse", "data-target" => "#devise-help-sign-in"} - Need Help? - #devise-help-sign-in.collapse - = render partial: 'devise/shared/links' + .container + = form_tag(new_user_session_path, class: '') do + %legend + %span + Sign In + .form-group + %label{for: "user[login]", class: 'col-sm-2 control-label'} + Username + .col-sm-10 + = text_field_tag 'user[login]', nil, placeholder: 'Username', class: 'form-control', required: 'required' + .form-group + %label{for: "user[password]", class: 'col-sm-2 control-label'} + Password + .col-sm-10 + = password_field_tag 'user[password]', nil, placeholder: 'Password', class: 'form-control', required: 'required' + .form-group + .col-sm-12 + %button.btn.btn-success.pull-right + Sign in + = render partial: 'devise/shared/openid' + %p.text-right + %a.small.btn.btn-default{"data-toggle" => "collapse", "data-target" => "#devise-help-sign-in"} + Need Help? + #devise-help-sign-in.collapse + = render partial: 'devise/shared/links' diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index a533ffe2..204b5b58 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -6,13 +6,15 @@ Devise.setup do |config| # Define the available openID providers that can be used to log in # Pass each provider to User model in :omniauth_providers (for open_id providers use their name) - config.omniauth :open_id, name: 'suse', identifier: 'http://www.opensuse.org/openid/user' + # config.omniauth :open_id, name: 'suse', identifier: 'http://www.opensuse.org/openid/user' config.omniauth :google_oauth2, (ENV['OSEM_GOOGLE_KEY'] || Rails.application.secrets.google_key), (ENV['OSEM_GOOGLE_SECRET'] || Rails.application.secrets.google_secret), name: 'google', scope: 'email' - config.omniauth :facebook, (ENV['OSEM_FACEBOOK_KEY'] || Rails.application.secrets.facebook_key), (ENV['OSEM_FACEBOOK_SECRET'] || Rails.application.secrets.facebook_secret) - config.omniauth :github, (ENV['OSEM_GITHUB_KEY'] || Rails.application.secrets.github_key), (ENV['OSEM_GITHUB_SECRET'] || Rails.application.secrets.github_secret) - + # config.omniauth :facebook, (ENV['OSEM_FACEBOOK_KEY'] || Rails.application.secrets.facebook_key), (ENV['OSEM_FACEBOOK_SECRET'] || Rails.application.secrets.facebook_secret) + # config.omniauth :github, (ENV['OSEM_GITHUB_KEY'] || Rails.application.secrets.github_key), (ENV['OSEM_GITHUB_SECRET'] || Rails.application.secrets.github_secret) + config.omniauth :discourse, + sso_url: "https://forum.snap.berkeley.edu/session/sso_provider", + sso_secret: ENV['OSEM_DISCOURSE_SECRET'] # ==> Mailer Configuration # Configure the e-mail address which will be shown in Devise::Mailer, # note that it will be overwritten if you use your own mailer class with default "from" parameter. From 2e62aaf0c8afe3515ad9241156b1f7d87d4e7117 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 03:32:52 -0800 Subject: [PATCH 27/61] Tweak devise modules list --- app/models/user.rb | 2 +- app/views/devise/shared/_openid_links.html.haml | 2 +- app/views/devise/shared/_sign_in_form_embedded.html.haml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 7c764fa1..1e148579 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -50,7 +50,7 @@ class User < ApplicationRecord else [:database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, - :omniauthable, omniauth_providers: [:suse, :google, :facebook, :github]] + :omniauthable, omniauth_providers: [:google, :discourse]] end devise(*devise_modules) diff --git a/app/views/devise/shared/_openid_links.html.haml b/app/views/devise/shared/_openid_links.html.haml index 19adf922..6331ad35 100644 --- a/app/views/devise/shared/_openid_links.html.haml +++ b/app/views/devise/shared/_openid_links.html.haml @@ -1,7 +1,7 @@ .text-center .btn-group.btn-group-lg#openid-btn-grp - omniauth_configured.each do |provider| - - if provider == :discourse + - if provider.to_s != :discourse = link_to "user_#{provider}_omniauth_authorize".to_sym, class: "btn btn-success btn-lg", id: "omniauth-#{provider}", title: "Your #{provider} login" do diff --git a/app/views/devise/shared/_sign_in_form_embedded.html.haml b/app/views/devise/shared/_sign_in_form_embedded.html.haml index dc719616..9a82b188 100644 --- a/app/views/devise/shared/_sign_in_form_embedded.html.haml +++ b/app/views/devise/shared/_sign_in_form_embedded.html.haml @@ -1,5 +1,5 @@ - if ENV['OSEM_ICHAIN_ENABLED'] != 'true' - .container + .container.panel = form_tag(new_user_session_path, class: '') do %legend %span From 640d33f18710472a253148f7b3908cfc9b9246cd Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 03:42:10 -0800 Subject: [PATCH 28/61] tweak form display in dropdown --- app/views/layouts/_navigation.html.haml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/views/layouts/_navigation.html.haml b/app/views/layouts/_navigation.html.haml index e4be6e15..93609372 100644 --- a/app/views/layouts/_navigation.html.haml +++ b/app/views/layouts/_navigation.html.haml @@ -54,13 +54,14 @@ = password_field_tag 'password', nil, id: 'user_ichain_password_dd', class: 'form-control', placeholder: 'Password' %button.btn.btn-success.btn-block Sign in - else - = form_tag new_user_session_path do - = text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail' - = password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password' - %p.text-right - %small - %label{for: 'user_remember_me'} Remember me - = check_box_tag 'user[remember_me]' + .container.panel + = form_tag new_user_session_path do + = text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail' + = password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password' + %p.text-right + %small + %label{for: 'user_remember_me'} Remember me + = check_box_tag 'user[remember_me]' %br %button.btn.btn-success.btn-block Sign in - unless omniauth_configured.empty? From 46a35cf7040d06555ab51e663163881ae3e81723 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 03:42:41 -0800 Subject: [PATCH 29/61] fix logic for snap sso link --- app/views/devise/shared/_openid_links.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/devise/shared/_openid_links.html.haml b/app/views/devise/shared/_openid_links.html.haml index 6331ad35..fc6086c9 100644 --- a/app/views/devise/shared/_openid_links.html.haml +++ b/app/views/devise/shared/_openid_links.html.haml @@ -1,13 +1,13 @@ .text-center .btn-group.btn-group-lg#openid-btn-grp - omniauth_configured.each do |provider| - - if provider.to_s != :discourse + - if provider != :discourse = link_to "user_#{provider}_omniauth_authorize".to_sym, class: "btn btn-success btn-lg", id: "omniauth-#{provider}", title: "Your #{provider} login" do %i{class: "fa fa-#{provider}"} - else - = link_to("Snap! Account", + = link_to("Snap!", "user_#{provider}_omniauth_authorize".to_sym, class: "btn btn-success btn-lg", id: "omniauth-#{provider}", From 55057686ecb5fba3c47239b7e784d98121f7114a Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 03:49:23 -0800 Subject: [PATCH 30/61] Dropdown menu style tweaks --- app/views/layouts/_navigation.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/_navigation.html.haml b/app/views/layouts/_navigation.html.haml index 93609372..7c2df0fe 100644 --- a/app/views/layouts/_navigation.html.haml +++ b/app/views/layouts/_navigation.html.haml @@ -54,8 +54,8 @@ = password_field_tag 'password', nil, id: 'user_ichain_password_dd', class: 'form-control', placeholder: 'Password' %button.btn.btn-success.btn-block Sign in - else - .container.panel - = form_tag new_user_session_path do + .panel{style: "padding: 6px"} + = form_tag new_user_session_path, class: 'form-group' do = text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail' = password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password' %p.text-right From 0c232ffc9d27020c8118f1d84f29742c86482c74 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 03:53:09 -0800 Subject: [PATCH 31/61] Help button is weird. --- app/views/layouts/_navigation.html.haml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/views/layouts/_navigation.html.haml b/app/views/layouts/_navigation.html.haml index 7c2df0fe..9419762e 100644 --- a/app/views/layouts/_navigation.html.haml +++ b/app/views/layouts/_navigation.html.haml @@ -62,16 +62,16 @@ %small %label{for: 'user_remember_me'} Remember me = check_box_tag 'user[remember_me]' - %br - %button.btn.btn-success.btn-block Sign in - - unless omniauth_configured.empty? - .divider - %h6.text-center - or - = render 'devise/shared/openid_links' - %p.text-right %br - %a.small.btn.btn-xs.btn-default{"data-toggle" => "collapse", "data-target" => "#navbar-devise-help"} - Need Help? - #navbar-devise-help.collapse - = render 'devise/shared/links' + %button.btn.btn-success.btn-block Sign in + - unless omniauth_configured.empty? + .divider + %h6.text-center + or + = render 'devise/shared/openid_links' + -# %p.text-right + -# %br + -# %a.small.btn.btn-xs.btn-default{"data-toggle" => "collapse", "data-target" => "#navbar-devise-help"} + -# Need Help? + -# #navbar-devise-help.collapse + -# = render 'devise/shared/links' From 4ea5fb0892cde473c1dfff68dd254411a52e8b87 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 19 Dec 2019 03:58:07 -0800 Subject: [PATCH 32/61] use a div with padding. --- app/views/layouts/_navigation.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/_navigation.html.haml b/app/views/layouts/_navigation.html.haml index 9419762e..e99513d9 100644 --- a/app/views/layouts/_navigation.html.haml +++ b/app/views/layouts/_navigation.html.haml @@ -54,7 +54,7 @@ = password_field_tag 'password', nil, id: 'user_ichain_password_dd', class: 'form-control', placeholder: 'Password' %button.btn.btn-success.btn-block Sign in - else - .panel{style: "padding: 6px"} + %div{style: "padding: 6px"} = form_tag new_user_session_path, class: 'form-group' do = text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail' = password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password' From 89de6479680a39ed38e95f181a2333fd56b9ae77 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Fri, 20 Dec 2019 12:14:14 -0800 Subject: [PATCH 33/61] attempt to fix the discourse callback URL --- Gemfile | 7 +++---- config/initializers/devise.rb | 11 ++++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 099ada92..6789f5ad 100644 --- a/Gemfile +++ b/Gemfile @@ -38,13 +38,12 @@ gem 'rails-i18n' gem 'devise' gem 'devise_ichain_authenticatable' -# for openID authentication gem 'omniauth' +gem 'omniauth-google-oauth2' +gem 'omniauth-discourse' +# gem 'omniauth-openid' # gem 'omniauth-facebook' # gem 'omniauth-github' -gem 'omniauth-google-oauth2' -# gem 'omniauth-openid' -gem 'omniauth-discourse' # Bot-filtering gem 'recaptcha', require: 'recaptcha/rails' diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 204b5b58..7da4d13d 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -7,14 +7,19 @@ Devise.setup do |config| # Pass each provider to User model in :omniauth_providers (for open_id providers use their name) # config.omniauth :open_id, name: 'suse', identifier: 'http://www.opensuse.org/openid/user' + config.omniauth :google_oauth2, (ENV['OSEM_GOOGLE_KEY'] || Rails.application.secrets.google_key), (ENV['OSEM_GOOGLE_SECRET'] || Rails.application.secrets.google_secret), name: 'google', scope: 'email' - # config.omniauth :facebook, (ENV['OSEM_FACEBOOK_KEY'] || Rails.application.secrets.facebook_key), (ENV['OSEM_FACEBOOK_SECRET'] || Rails.application.secrets.facebook_secret) - # config.omniauth :github, (ENV['OSEM_GITHUB_KEY'] || Rails.application.secrets.github_key), (ENV['OSEM_GITHUB_SECRET'] || Rails.application.secrets.github_secret) + config.omniauth :discourse, sso_url: "https://forum.snap.berkeley.edu/session/sso_provider", - sso_secret: ENV['OSEM_DISCOURSE_SECRET'] + sso_secret: ENV['OSEM_DISCOURSE_SECRET'], + callback_url: user_discourse_omniauth_callback + + # config.omniauth :facebook, (ENV['OSEM_FACEBOOK_KEY'] || Rails.application.secrets.facebook_key), (ENV['OSEM_FACEBOOK_SECRET'] || Rails.application.secrets.facebook_secret) + # config.omniauth :github, (ENV['OSEM_GITHUB_KEY'] || Rails.application.secrets.github_key), (ENV['OSEM_GITHUB_SECRET'] || Rails.application.secrets.github_secret) + # ==> Mailer Configuration # Configure the e-mail address which will be shown in Devise::Mailer, # note that it will be overwritten if you use your own mailer class with default "from" parameter. From 7b94c24251b3bd014cf63f3a2832c3a8aa5978a6 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Fri, 20 Dec 2019 12:45:31 -0800 Subject: [PATCH 34/61] Do not need to specify callback url --- config/initializers/devise.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 7da4d13d..0afd8ae3 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -14,8 +14,7 @@ Devise.setup do |config| config.omniauth :discourse, sso_url: "https://forum.snap.berkeley.edu/session/sso_provider", - sso_secret: ENV['OSEM_DISCOURSE_SECRET'], - callback_url: user_discourse_omniauth_callback + sso_secret: ENV['OSEM_DISCOURSE_SECRET'] # config.omniauth :facebook, (ENV['OSEM_FACEBOOK_KEY'] || Rails.application.secrets.facebook_key), (ENV['OSEM_FACEBOOK_SECRET'] || Rails.application.secrets.facebook_secret) # config.omniauth :github, (ENV['OSEM_GITHUB_KEY'] || Rails.application.secrets.github_key), (ENV['OSEM_GITHUB_SECRET'] || Rails.application.secrets.github_secret) From 4c28ecf254d3f990425cfecaec9408b7150d6b0b Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Sun, 5 Jan 2020 15:16:14 -0800 Subject: [PATCH 35/61] Use Ruby 2.5.5 since that is in the docker dev container --- .ruby-version | 2 +- Gemfile | 2 +- Gemfile.lock | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.ruby-version b/.ruby-version index 437459cd..0cadbc1e 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.0 +2.5.5 diff --git a/Gemfile b/Gemfile index 6789f5ad..1a43ca93 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' -ruby ENV['OSEM_RUBY_VERSION'] || '2.5.0' +ruby ENV['OSEM_RUBY_VERSION'] || '2.5.5' # rails-assets requires >= 1.8.4 if Gem::Version.new(Bundler::VERSION) < Gem::Version.new('1.8.4') diff --git a/Gemfile.lock b/Gemfile.lock index e3caeae9..788c1861 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -373,9 +373,6 @@ GEM public_suffix (3.1.1) puma (3.12.2) rack (2.0.8) - rack-openid (1.3.1) - rack (>= 1.1.0) - ruby-openid (>= 2.1.8) rack-test (1.1.0) rack (>= 1.0, < 3) rails (5.2.3) @@ -715,7 +712,7 @@ DEPENDENCIES whenever RUBY VERSION - ruby 2.5.0p0 + ruby 2.5.5p157 BUNDLED WITH 1.17.3 From 2e817d87399c03d2fce944870994df97b690e21b Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Sun, 5 Jan 2020 15:43:11 -0800 Subject: [PATCH 36/61] Improve markdown support and tweak sponsorship langage --- app/helpers/format_helper.rb | 6 ++++++ app/views/conferences/_sponsors.haml | 4 ++-- app/views/conferences/show.html.haml | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/helpers/format_helper.rb b/app/helpers/format_helper.rb index 9289b79c..9dc7abc5 100644 --- a/app/helpers/format_helper.rb +++ b/app/helpers/format_helper.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +require 'redcarpet/render_strip' module FormatHelper ## @@ -206,6 +207,11 @@ module FormatHelper markdown("#{text} Please look at #{link_to '**Markdown Syntax**', 'https://daringfireball.net/projects/markdown/syntax', target: '_blank'} to format your text", false) end + # Return a plain text markdown stripped of formatting. + def plain_text(content) + Redcarpet::Markdown.new(Redcarpet::Render::StripDown).render(content) + end + def quantity_left_of(resource) return '-/-' if resource.quantity.blank? diff --git a/app/views/conferences/_sponsors.haml b/app/views/conferences/_sponsors.haml index 5d7bbaa9..ba74c331 100644 --- a/app/views/conferences/_sponsors.haml +++ b/app/views/conferences/_sponsors.haml @@ -27,9 +27,9 @@ .row .col-md-12 %h3.text-center - Want to sponsor? + = "Interested in sponsoring #{conference.title}?" = link_to(sponsorship_mailto(conference)) do - Contact us! + Please, contact us! - sponsors.each do |sponsor| - content_for :modals do diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index c478a8a2..f067fe2d 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -1,10 +1,10 @@ - content_for :head do %meta{ property: "og:title", content: @conference.title } %meta{ property: "og:site_name", content: (ENV['OSEM_NAME'] || 'OSEM') } - %meta{ property: "og:description", content: @conference.description } + %meta{ property: "og:description", content: plain_text(@conference.description) } %meta{ property: "og:url", content: conference_url(@conference.short_title) } %meta{ property: "twitter:title", content: (@conference.title) } - %meta{ property: "twitter:description", content: @conference.description } + %meta{ property: "twitter:description", content: plain_text(@conference.description) } - if @conference.picture? %meta{ property: "og:image", content: @image_url } %meta{ property: "og:image:secure_url", content: @image_url } From 5a88299f76f449085d1a7c82a5069893516323cd Mon Sep 17 00:00:00 2001 From: James Mason Date: Sat, 29 Dec 2018 15:36:17 -0800 Subject: [PATCH 37/61] Remove travel schedule from registration (cherry picked from commit d18cc02f0185df39bb4213d8a63a955dfb433dcb) Re: https://github.com/openSUSE/osem/issues/2333 --- CHANGES.md | 6 ++++ app/assets/javascripts/osem-datepickers.js | 34 ------------------- .../admin/registrations_controller.rb | 2 +- .../conference_registrations_controller.rb | 2 +- app/datatables/registration_datatable.rb | 4 --- app/models/registration.rb | 15 -------- app/views/admin/registrations/index.html.haml | 18 ---------- app/views/admin/registrations/index.pdf.prawn | 6 +--- .../admin/registrations/index.xlsx.axlsx | 5 +-- .../conference_registrations/_form.html.haml | 1 + .../_registration_info.html.haml | 6 ---- .../conference_registrations/show.html.haml | 22 ------------ ...ve_arrival_departure_from_registrations.rb | 6 ++++ db/schema.rb | 4 +-- ...conference_registration_controller_spec.rb | 20 ++++++----- spec/models/registration_spec.rb | 22 ------------ 16 files changed, 29 insertions(+), 144 deletions(-) create mode 100644 db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb diff --git a/CHANGES.md b/CHANGES.md index db20a234..432cdcdf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,12 @@ Not release yet... ## Update from 1.0 +### Dropped travel information +We have dropped input and storage of travel schedules for event registrants. If +you would like to continue to collect travel schedules, please create a custom +survey for this purpose. +_Please be aware that existing travel data will be destroyed during migration._ + ### Multiple Schedules A conference can have multiple schedules now so it's easier for organizers to test schedules and collaborate on different versions. diff --git a/app/assets/javascripts/osem-datepickers.js b/app/assets/javascripts/osem-datepickers.js index b907aa0c..c11c61a9 100644 --- a/app/assets/javascripts/osem-datepickers.js +++ b/app/assets/javascripts/osem-datepickers.js @@ -13,40 +13,6 @@ $(function () { format: 'YYYY-MM-DD HH:mm' }); - $("#registration-arrival-datepicker").datetimepicker({ - useCurrent: false, - stepping: 15, - sideBySide: true, - format: "YYYY-MM-DD HH:mm", - // current_date <= arrival_date <= end_date - maxDate : $("#registration-arrival-datepicker").attr('end_date'), - minDate : today - }); - - $("#registration-departure-datepicker").datetimepicker({ - useCurrent: false, - stepping: 15, - sideBySide: true, - format: "YYYY-MM-DD HH:mm", - // departure_date > start_date - minDate : $("#registration-arrival-datepicker").attr('start_date') - }); - - $("#registration-arrival-datepicker").on("dp.change",function (e) { - // departure_date > start_date,arrival_date - if ((new Date(e.date).getTime()) > (new Date($("#registration-arrival-datepicker").attr('start_date')).getTime())){ - $('#registration-departure-datepicker').data("DateTimePicker").minDate(e.date); - } - else{ - $('#registration-departure-datepicker').data("DateTimePicker").minDate($("#registration-arrival-datepicker").attr('start_date')); - } - }); - - // departure_date >= arrival_date - $("#registration-departure-datepicker").on("dp.change",function (e) { - $('#registration-arrival-datepicker').data("DateTimePicker").maxDate(e.date); - }); - $("#conference-start-datepicker").datetimepicker({ useCurrent: false, format: "YYYY-MM-DD", diff --git a/app/controllers/admin/registrations_controller.rb b/app/controllers/admin/registrations_controller.rb index 89c4d069..ef94ae2e 100644 --- a/app/controllers/admin/registrations_controller.rb +++ b/app/controllers/admin/registrations_controller.rb @@ -82,7 +82,7 @@ module Admin def registration_params params.require(:registration).permit( - :user_id, :conference_id, :arrival, :departure, :attended, + :user_id, :conference_id, :attended, :volunteer, :other_special_needs, :accepted_code_of_conduct, vchoice_ids: [], qanswer_ids: [], qanswers_attributes: [], event_ids: [] ) diff --git a/app/controllers/conference_registrations_controller.rb b/app/controllers/conference_registrations_controller.rb index 5c17d8dc..887d0ce1 100644 --- a/app/controllers/conference_registrations_controller.rb +++ b/app/controllers/conference_registrations_controller.rb @@ -110,7 +110,7 @@ class ConferenceRegistrationsController < ApplicationController def registration_params params.require(:registration) .permit( - :conference_id, :arrival, :departure, + :conference_id, :volunteer, :accepted_code_of_conduct, vchoice_ids: [], qanswer_ids: [], qanswers_attributes: [], diff --git a/app/datatables/registration_datatable.rb b/app/datatables/registration_datatable.rb index bdd97e72..a20fe3af 100644 --- a/app/datatables/registration_datatable.rb +++ b/app/datatables/registration_datatable.rb @@ -10,8 +10,6 @@ class RegistrationDatatable < AjaxDatatablesRails::Base roles: { source: 'Role.name' }, email: { source: 'User.email' }, accepted_code_of_conduct: { source: 'Registration.accepted_code_of_conduct', searchable: false }, - arrival: { source: 'Registration.arrival', searchable: false }, - departure: { source: 'Registration.departure', searchable: false }, actions: { source: 'Registration.id', searchable: false, orderable: false } } end @@ -36,8 +34,6 @@ class RegistrationDatatable < AjaxDatatablesRails::Base roles: conference_role_titles(record.user), email: record.email, accepted_code_of_conduct: !!record.accepted_code_of_conduct, # rubocop:disable Style/DoubleNegation - arrival: record.arrival&.utc, - departure: record.departure&.utc, questions: {}, edit_url: edit_admin_conference_registration_path(conference, record), DT_RowId: record.id diff --git a/app/models/registration.rb b/app/models/registration.rb index 84a9aba0..759003fd 100644 --- a/app/models/registration.rb +++ b/app/models/registration.rb @@ -28,8 +28,6 @@ class Registration < ApplicationRecord validates :user_id, uniqueness: { scope: :conference_id, message: 'already Registered!' } validate :registration_limit_not_exceed, on: :create - validate :registration_to_events_only_if_present - validates :accepted_code_of_conduct, acceptance: { if: -> { conference.try(:code_of_conduct).present? } } @@ -48,19 +46,6 @@ class Registration < ApplicationRecord private - ## - # If the user registers to attend events that are already scheduled, - # only allow registration to events if the user will be present - # (based on arrival and departure attributes) - # No validation if arrival/departure attributes are empty - def registration_to_events_only_if_present - if (arrival || departure) && events.pluck(:start_time).any? - errors.add(:arrival, 'is too late! You cannot register for events that take place before your arrival') if events.pluck(:start_time).compact.map { |x| x < arrival }.any? - - errors.add(:departure, 'is too early! You cannot register for events that take place after your departure') if events.pluck(:start_time).compact.map { |x| x > departure }.any? - end - end - def subscribe_to_conference Subscription.create(conference_id: conference.id, user_id: user.id) end diff --git a/app/views/admin/registrations/index.html.haml b/app/views/admin/registrations/index.html.haml index 8ea544d8..09f674e9 100644 --- a/app/views/admin/registrations/index.html.haml +++ b/app/views/admin/registrations/index.html.haml @@ -30,8 +30,6 @@ %th{ width: '0' } E-Mail %th{ width: '0' } %abbr{ title: 'Code of Conduct' } CoC - %th{ width: '0' } Arrival - %th{ width: '0' } Departure %th{ width: '0' } Actions %tbody @@ -81,22 +79,6 @@ "className": "code-of-conduct text-center", "searchable": false }, - { - "data": "arrival", - "searchable": false, - "render": function(data, type, row) { - if (data) { return moment(data).format('ll LT'); } - return ''; - } - }, - { - "data": "departure", - "searchable": false, - "render": function(data, type, row) { - if (data) { return moment(data).format('ll LT'); } - return ''; - } - }, { "data": null, "className": "actions", diff --git a/app/views/admin/registrations/index.pdf.prawn b/app/views/admin/registrations/index.pdf.prawn index d7c97ef2..3edebf04 100644 --- a/app/views/admin/registrations/index.pdf.prawn +++ b/app/views/admin/registrations/index.pdf.prawn @@ -4,9 +4,7 @@ prawn_document(force_download: true, filename: @pdf_filename, page_layout: :land 'Name', 'Nickname', 'Affiliation', - 'Email', - 'Arrival Date', - 'Departure Date'] + 'Email'] @conference.questions.each do |question| header_array << question.title end @@ -19,8 +17,6 @@ prawn_document(force_download: true, filename: @pdf_filename, page_layout: :land row << registration.nickname row << registration.affiliation row << registration.email - row << registration.arrival.to_s || '' - row << registration.departure.to_s || '' @conference.questions.each do |question| qa = registration.qanswers.find_by(question: question) diff --git a/app/views/admin/registrations/index.xlsx.axlsx b/app/views/admin/registrations/index.xlsx.axlsx index ee49eb4d..a95c163e 100644 --- a/app/views/admin/registrations/index.xlsx.axlsx +++ b/app/views/admin/registrations/index.xlsx.axlsx @@ -3,7 +3,7 @@ wb = xlsx_package.workbook wb.add_worksheet(name: 'registrations') do |sheet| bold_style = wb.styles.add_style(b: true) - row = ['Attended', 'Name', 'Nickname', 'Affilιation', 'Email', 'Arrival', 'Departure'] + row = ['Attended', 'Name', 'Nickname', 'Affilιation', 'Email'] @conference.questions.each do |question| row << question.title @@ -18,8 +18,6 @@ wb.add_worksheet(name: 'registrations') do |sheet| row << registration.nickname row << registration.affiliation row << registration.email - row << registration.arrival.to_s - row << registration.departure.to_s @conference.questions.each do |question| qa = registration.qanswers.find_by(question: question) answer = ( qa ? qa.answer.title : '' ) @@ -30,4 +28,3 @@ wb.add_worksheet(name: 'registrations') do |sheet| sheet.add_row row end end - diff --git a/app/views/conference_registrations/_form.html.haml b/app/views/conference_registrations/_form.html.haml index 971a613f..1dd5f175 100644 --- a/app/views/conference_registrations/_form.html.haml +++ b/app/views/conference_registrations/_form.html.haml @@ -22,6 +22,7 @@ = render partial: 'devise/shared/sign_up_form_embedded' = render partial: 'registration_info', locals: { f: f } + = f.input :conference_id, as: :hidden, value: @conference.id .row .col-md-12 %p.pull-right diff --git a/app/views/conference_registrations/_registration_info.html.haml b/app/views/conference_registrations/_registration_info.html.haml index a81f385d..5fdd9bf4 100644 --- a/app/views/conference_registrations/_registration_info.html.haml +++ b/app/views/conference_registrations/_registration_info.html.haml @@ -24,10 +24,4 @@ (Scheduled on: #{event.time.to_date}) %br - - -= f.inputs 'Your Travel Info' do - = f.input :arrival, as: :string, label: 'Your arrival time', hint: "Leave blank if not sure", input_html: { value: (f.object.arrival.to_formatted_s(:db_without_seconds) unless f.object.arrival.nil?), id: 'registration-arrival-datepicker',start_date: @conference.start_date,end_date: @conference.end_date } - = f.input :departure, as: :string, label: 'Your departure time', hint: "Leave blank if not sure", input_html: { value: (f.object.departure.to_formatted_s(:db_without_seconds) unless f.object.departure.nil?), id: 'registration-departure-datepicker' } - = render 'conferences/code_of_conduct', organization: @conference.organization diff --git a/app/views/conference_registrations/show.html.haml b/app/views/conference_registrations/show.html.haml index afb5b9e0..d060e412 100644 --- a/app/views/conference_registrations/show.html.haml +++ b/app/views/conference_registrations/show.html.haml @@ -33,28 +33,6 @@ data: { toggle: 'modal', target: '#modal-code-of-conduct'} = render 'conferences/code_of_conduct', organization: @conference.organization - .row - .col-md-12 - %h4 - %span.fa-stack - %i.fa.fa-square-o.fa-stack-2x - %i.fa.fa-plane.fa-stack-1x - Travel Schedule - %ul - %li - - if @registration.arrival.present? - arrive at - %strong - = @registration.arrival.strftime('%A, %B %-d. %Y %H:%M') - - else - You haven't scheduled your arrival - %li - - if @registration.departure.present? - depart at - %strong - = @registration.departure.strftime('%A, %B %-d. %Y %H:%M') - - else - You haven't scheduled your departure - if @conference.surveys.for_registration.any? .row .col-md-12 diff --git a/db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb b/db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb new file mode 100644 index 00000000..18f1398d --- /dev/null +++ b/db/migrate/20181229233811_remove_arrival_departure_from_registrations.rb @@ -0,0 +1,6 @@ +class RemoveArrivalDepartureFromRegistrations < ActiveRecord::Migration[5.0] + def change + remove_column :registrations, :arrival, :datetime + remove_column :registrations, :departure, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 2cb9ac88..2ad25c7e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20181113195810) do +ActiveRecord::Schema.define(version: 20181229233811) do create_table "answers", force: :cascade do |t| t.string "title" @@ -364,8 +364,6 @@ ActiveRecord::Schema.define(version: 20181113195810) do create_table "registrations", force: :cascade do |t| t.integer "conference_id" - t.datetime "arrival" - t.datetime "departure" t.datetime "created_at" t.datetime "updated_at" t.text "other_special_needs" diff --git a/spec/controllers/conference_registration_controller_spec.rb b/spec/controllers/conference_registration_controller_spec.rb index f2849c27..964acaac 100644 --- a/spec/controllers/conference_registration_controller_spec.rb +++ b/spec/controllers/conference_registration_controller_spec.rb @@ -290,14 +290,15 @@ describe ConferenceRegistrationsController, type: :controller do before do @registration = create(:registration, conference: conference, - user: user, - arrival: Date.new(2014, 04, 25)) + user: user) end context 'updates successfully' do before do - patch :update, params: { registration: attributes_for(:registration, arrival: Date.new(2014, 04, 29)), - conference_id: conference.short_title } + patch :update, params: { + registration: attributes_for(:registration, volunteer: true), + conference_id: conference.short_title + } end it 'redirects to registration show path' do @@ -309,16 +310,17 @@ describe ConferenceRegistrationsController, type: :controller do end it 'updates the registration' do - @registration.reload - expect(@registration.arrival).to eq Date.new(2014, 04, 29) + expect{ @registration.reload }.to change(@registration, :updated_at) end end context 'update fails' do before do allow_any_instance_of(Registration).to receive(:update_attributes).and_return(false) - patch :update, params: { registration: attributes_for(:registration, arrival: Date.new(2014, 04, 27)), - conference_id: conference.short_title } + patch :update, params: { + registration: attributes_for(:registration, volunteer: true), + conference_id: conference.short_title + } end it 'renders edit template' do @@ -331,7 +333,7 @@ describe ConferenceRegistrationsController, type: :controller do it 'does not update the registration' do @registration.reload - expect(@registration.arrival).to eq Date.new(2014, 04, 25) + expect { @registration.reload }.not_to change(@registration, :updated_at) end end end diff --git a/spec/models/registration_spec.rb b/spec/models/registration_spec.rb index 9f710416..d6c86838 100644 --- a/spec/models/registration_spec.rb +++ b/spec/models/registration_spec.rb @@ -51,26 +51,4 @@ describe Registration do expect(subject).to receive(:send_registration_mail) end end - - describe 'registration_to_events_only_if_present' do - context 'valid' do - it 'when user registers for events happening while user is at the conference' do - registration.arrival = conference.start_date - registration.departure = conference.end_date - registration.events << create(:event, program: conference.program, start_time: conference.end_date) - - expect(registration.valid?).to eq true - end - end - - context 'invalid' do - it 'when user registers for events happening while user is not at the conference' do - registration.arrival = conference.start_date - registration.departure = conference.start_date - registration.events << create(:event, program: conference.program, start_time: conference.end_date) - - expect(registration.valid?).to eq false - end - end - end end From 5f1f93d2218c8e97ae98e3986672dcf491ca9de4 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 00:08:05 -0800 Subject: [PATCH 38/61] Add a snap logo to the navbar --- app/assets/images/snapcon_logo.png | Bin 0 -> 49365 bytes app/assets/stylesheets/osem-navbar.scss | 5 ++ app/helpers/application_helper.rb | 2 +- app/views/layouts/_navigation.html.haml | 60 +++++++++++++----------- 4 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 app/assets/images/snapcon_logo.png diff --git a/app/assets/images/snapcon_logo.png b/app/assets/images/snapcon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cec0ed9bc8878bb444b2841e47371fba705ff211 GIT binary patch literal 49365 zcmce;WmH_v5;h71f(9qJyAB%M-Q9vi26uONcXtWymf#lL-QC@S%blEaUb)};?%zAJ zX6@d+`>E>clJ2hF5T+m}{s|5T4h#(Jlca=*5*XMAQ7|xYG?1_F#sAvUrG$3-dvb1*Ka^)rYPYW(k z`A;=~gy=s_94&ZBG-MTsgl+7BL~IPK42&dva708zJoev=xs*i2{s#x$@sgN2I@)pp z04^>r3@$7THufd}CQeRH03$PinVBBcg5JT++R?z3-r9lmzeN6`BLZ|VvNyAJG_$cL z`a{>i(8kG;mxSaGqrX4@?Wd!e@jslb9sVa4NI<}!Cjce}M!^3K26Q$1|A75@@?Y40 zi+58f7>eo9c(O}{xny$Hgn`-{vYK3sQwq~ z4{t7E8%rB|Wm^Ly;2$RcXVw4NTEWZ}XsID$W(Bl%_|q>A7WV&v{?8}>SES}YNM?4n ze>j{C{den&*S#0sL)6d~gld^Xgz=0$`FNf-0`yr&-XR=)dl} zOzxj_+~tV^6$*#yL)SXNB91$f({di=pXLODh(D#!W$Uq zI9w_vtCAI`Uj3^}Y7gN%)ArGg+tg;K|3q`2(5DMad{HDtYguTXEo~KSl%F$`#%ExqC<_CxPphXGw&cHTe zK6dG10TaG(a(Ov9zEU?YAfSdqn(XL8z`O zy(KC2SQPZJlB3qZ>6340;r=h_V5>Yd4Jc+qTcz+cFD*o-Jbzox(b_r!??VUL0Js^QQhQAb7@mN!L_AAU)yF^uuy+7e% z9)w^15K=*og=`3xHWrP1em(J}!}|>PH!~Os5HqN6jV$tRCb18P?-{Md&IDpv7WpZC-BUY!^ z!hivGGyfBT|2J+MpQTOs@0Kc#3v4|18ul7e=X21oP_0P<72j1MgHZ%Hu zz2txC&mztXYr8iLLAt=cUWemHsCfI(>SOi06Zg%g7YTmjgr8<{A@luks~Uxm_;Sl* zbGfHD;l^^lX!h6d0Iv^?7^qs^_chWmCVXP27=9>=vPQ>JLLn7D#jMN&#uatWwtfD# zAzxJ3S@!cpQ{3fUL5NxVFSXYxOP%v-mQnDD>%>V6(KQuurbYv3Nz|o1u^a}71~Qr= zmEol6lMr2QpZVHmgcCU~f(ScczF&bKKj0NIJ=9^*ONfOWlcdQ3Rfq z8ZNixLSw6OfLP_aKt&j5p_Nt!Dt@+mM$t(Ye;AvtsXktF;oOzf~;&F@_>gT*Ao(?i_s)R`T{3Et~vOt^8VQN>}b5XM@sN zB3z~MEwsb3Jvw^S!2P!5cQLbTj~dp(fXb;XlGC2omoSH9zFxb+0?OM#`k6#mE$_*$ z;#OuE$DM@AUA55bf6cj*5Fm5>3WiQq9KpVUFH)xVHqJ?lzGQ2x`KF|T;$#b_2=#lj zfmmn1RuJ}mj-rXXhmrcnTa+(+-1p-8#(EEzQu?Le9raI>FyiF=fFY=EyazMI;boO{ zn0!RSYy#&!%n4}oiR`-20=B=kDc}GKA?DF?zL~UNt&cyni*yRuIZDyS_s1ec?GTF) z`ux_lnl4P!->|bJ8&Q^4IIyy~VFy&wuiCm<4H<7U5+;h*v?;;OeHAvJ?W+&j!-$yv zmqbLFAU*YHKI%w$yQgn_cQG$-sm2$7wi zPrfJmxnW)ZxdN#kqx!N|G^)g8&}9BH)gxY6ehG&&BIIA>Hx)sC=!RZ>5lA=+<|7Q$ z{uDihwV`QOYaCU|&E({+-(0nmD2ZS++{pn&a76}g8`}^)&Ch3x?&Z?TX2NH;JnpKL zrB%0Oyz6`7lQlbgd-X0G|W`XGx^%_LGq zBeSeMl=0av%?>eo*1-tX5jH$_>(HZ`a~{6Q{;o~&vK$jVzBluCmx;u?(K;73xdi(= z%=tp{2!Q5RB!S;WgWJHC@kB-ZK=$*Oo;<#_*%nB{Q(HiB6rn>oO~pydCW0Lw8%z?r zR9Et|j*0jc(zB&W$Cn>?dr{x7ehDVewWDTn>}XN|`93aRibCbe{T1LUL;pC5%F^S= zC-u6-E#c@##~CaxWTWeLW7+G`6V(<*EVy63F~J$ru#;tN5;tLwJ{tCXGMn0Jz*On5 zw7EunT$ZatXCPLf+P`9x1SqD1mCp6-^$#(^8x;W}dP6i3kDvT?HVnSvC_)vm?2Zh_ z=4MRC>yP9GwOST;o^I9P#Suw%R3H?r=bE`JG@?*fs}56QkpFAy+{6P}KE$RJ)hMfu zJk0B|y66_B`lsV39Fs%a8M=Hn`u=QUy}7_PcWQdpC3(-zG5hTT??$%H5nAm+R<)vb za(DYjh_-$ah(61IEW6;3Wur&D6sKkfy5vR#U%)@Rb#Poky>N&(E2}tpH1btaWlQloS6`N=z$uLZ9ZC0^?4XB=-EM zxxTi~ymohJ2no^SuB4uq$bTEe|6GNd2Dqg(1Jg52*k+a3KO2zR!lPDV!QTYvg~V{v z;y=FO1-FgvIbFi$&xmQ8{$;>$weY<)LSL2ImuvgmyiY-t~C&8=RJMT9%S&@yO zlZSnIQr^yEuFKjPm33&m_0}PKi`-0zH{kN+7D^p_&RizPk9}0K8ViIOGJ%x;^6E(# zkTKx+<XCj)orT(v517@vPI_=Fs&Y3UP`E4Of+`4s$>=xj>dF*=7Vu3n;@7+_)BiK)V%ZKFmNJkPg2={Sgrg#-ozv1&h_vIb5<2RNuLeH z_7k;e2RD3(azyfe=jP<}rw*{Z-82?mb})>8h=x=6%EjfEhs37q5guwKaQjqKj?H3u z&_!WA({{qpiY4EWnI_5}=IDteXS+U1+g=YmLWJ~B#z7*zyr9X>f<+b{M!*SV{bgF{ zQlO|9q=sPgx#-Ap>U!Z3N~wScXsnQ-H2|se_U4iuA7dXUU<7F?{=SlTys3Fdn6f>cal{aNzuoSmd&FnkQnuM9RC4YjFL3RxdDWS!fT-QdGnij^AwAu z7Y{-`9BqY$wIe8Z3uMTM0(~D3Rz7OLB?Eh$vdPHWGtFENsOW%0Ht9`9N_i=>bj6m5 zL4Ol{zy#S7`d7WZ43m(h5$0iDgY5a(7uUWY0o86oUxq~>&QUi>=TzSuJHj)8%U z-RJu$>AIL)p@G^@M+ug;)3lp-ilx_#{Qnq}56GC5OtX?I5Ht_%Ic;JWc)nKJc*y6} zjI56)t20OmLrlY7_KMPeVQ9^p_qMS8>X*4LlnV~p>ZjAFdv=NXlN&1l3 z?+VMLbNwLVHDIv-Hy#KZ=L-Qdc{=7Uy|?dDVUj%Rv~1sQj&gx_R1nf>b9#UM;en*P z{7@15FRD4nAgYv$8EWY{26$a%5^6KlfmsHcY_R87<6*}&uwF)nhUS5LJt`6cZjk!p zas6q{TPMf-dg+Q^r-;suk}vqn9+z-u8KM08)GM#nSvOp-h#BFpKN z&D$cUb}8Wla|{folihuSB*Nyzs13r^upD5>!<0m>+JyyQH+*C-{c0*M$Gts*X{>{7*M&A=~!R6GUqxrs{IlkK(t<3UN(})58^1E1Haah-1 z)HK=z=)zPkI8ymHre^6Vh)`>Xg}eN)GjyFSlY6r=N;#QjC*)tPcX7YM8X_o|k%Z>0 zon^>+Wn+JGAj&lSrcXe&DG!Nf;)4t1yFCwHp2nzX&LY)$n8Y`DedG0mm9M;{G&ZIE zOVebN9N-rmqG|nExw^?+;8B>u4~l9)8n&j^gO=R4BYv2Py~jjRTGEfoDN#r@n|J+X z!jgx3wAQn~bUP-`MpMCIADFRIWFolc4NP?T#Z5YYlXrscStL~b- zXG8w>*Fo{F9XS-CX%B4CGGWb?tam;SV!_?H z6zlsjPk+s3gMuJ_acB3p(ll~y-Xe%bd&%8Gsq8vE^hUw}50`?~y0tj+h^zh%sA?%S$ULN(bDoyw_q3T+Oh$rx|X=Jew46<6M z(D`1tD9m6Wy}CdBGs$5>5V(X7yNsq;0<`Oth6EZ=3eKY>bbjYmThfiPTKR>#3kMym zpBUm3d-1nPtvIhv2;Jy&kxiz%KXxA>eEfF# z<)5(>KnDkKh&J)kGP={=XZ*R&_B}VND2qw)$U!FOpEfOD3>tPD2XGdA#p47{ zNCakJJqih#e%U__ejV-;KH4ExP~^q}Oa(L3b!I||G!-dcvZL~SU0mpbabjb2o{g1* z0!Y#5r^TQKGXoj>@-xXB@ccFQdmmX6$sa2sG7YHIE7*=Fg8NnH8L9ig?QKDsyj%?A z%QoePvwgO^?IN@nKcK?2S9^ex?#hL%R)qSmj#19?cTy3`@~|KD#!BnOLeqvgAa@-{ z$qmAl-FwbXSJ!g5{HVt?b%=)d)W?0ncIW=U5{Y zr*}w~Ap|2CS$m}J8{3ZU8y;`3H!8`Zy>1iu9B4Vb3H3*Fa4b=tV7@SbL{UVH`Nh%` zAuNhHTH;D-S(Aw5PKIxBOO~p(owNnw7nkSZN%qL1*b)N7kaW+}E9vq8jr}tEj?ol~ zqaEW4g!bJxkJQ7r2ah|TXs-1yRH_jeB&QN{N;`ymvfD#P#q_+IvVn!!Umc&hdp!lh zq&=ykFqZ=$UxIwuGf6t(Ai!uBd_J==9jMu;=sz}Dge*m<+gQtCjxbh>%Ddgd21^dG zE06j0I7kQ(`5k)!em7)$I&lvCBTzX!z(U8h&(ga z-~D2lXtV`K%s7lGDb`wlLUM zUdUrh5U91>=5*QWrL{B5hZ(1)yW}aw14`5RD#5xgQZH99eC1n5+VEx8+WDRq;#N1k z37!iPQhR0Kp2!es^*&B7GpzlqZU=w;6RsS&)v}Ylid&JBxuWQpY3k_LgHzY|41pzJ z>^Y?N>HxqD)5+iV_TexN-v^tw;uXa)9TL@2bf^MaSGtn#?#0k_wf~`R@dXt;eKJpE z!+01`b@fu5mH5mJT5|C6t6ut=xs#s5$#ik1+&L66m|<@uq36?i-*aH06}{QGG0yTl zsxiT8@c@)k8n)C%9*PSAm@3RX0+=kKUN4J*f-gtDO}bXpgGq z68nva6s?%fwiEw|(JD44d<-V%i6;1H+WnI<)eyAL)%>?LKj*K&22hGP1pOasCO=^m zE);s+OeL=QGwbK8iRKz#uoP6d>3Qyy(QlEeKROy|(knv${s4WHu7@y`kVEuTh`&iB zh(u#8MZ{<)*KasHm3F>p|9kTM?EGhudKI@D1d|oUErMpr2@BOqp#a^+2GGztG|OB! z&>{Mb!rwze;0TiE7(Hw4T`hm-aHcp3F^}mPORbgBS?X6*R93={#!;}eo_#tJk0Kxf z=qO!KJeu)~(X8?JK;rFv<-POWO5MS&`lR5ju%z=(3wQ*FrJD1IH1*aDq?u*{h&i7& z_oUyuS`i#6oPyLv^QkSU^OL_UE!p?H#$#Fa2tCXYIV3qo$DuJC$11TSvgGdZNY+R7 z3ykmbW4?QDeMrE_i#JA*wTs?@3f;X+B|*3jMoBzXXZj{{%PQ^1KAVRK3T=fbmxmeN zq$3R}#@QG4%2m#4cl(a*#dMpNluB+(G_tNv64S3K12XjT%K5^ME1e6?S?(777a1-G z=T|NvCDH674Oc2z`Kw(-$g9s+Ifhl#W=5v>o50Iwp6`K5puJ^SyJJ$R=fvqixl0tM zW=mB-`SroikTK}>jsZ))tS%%IRsSqM>t3CAU6*34kkA7qE4%NITshx|)nl;}za|=0 zSgRtUAO#S&>%Uld3w}S^K=%FMQy{BDi&rbdBeW_HHu&`zP{ z>%kKKQl-P_PysXNol#^Rm4|FZ!O99@z8*UW_ZS7KskGCNTtE1d`e(jILc1(cR%vT_ zEzd0YF;!)stcoUvL6Yl=XU9ncS$HE6pZUWq`Hmp2LO<^aaB-UMM257_J;ex>K|S1X zssH-k@uYu^pU-UcT}?LE^`?tM$?gyzW^i*}8?-aPc+p)j zxB7T>!?F#g7M1Jbx!%pM(RIU{XRVHSjDB#2=*t_UPjAMp1E)oOqbRCUJ-5fb1T%jA zpjeA63-ZUQCAPDJ+4*DzQ1{0XHV67{POz?Wf^lsy z`5WY=NB8vymgucuM-aCyA4x4AH{|l8rRH^i)*HCToZ-p{lL!x3?-ryrhMzUQuQ=T_ zc@<+qnj450Hu#)&KQnmnDvX5eUGspaJB8GevF{K^mt&y2joy4_E8h~a>?_hqo28Eu zZ?XJBn_WR!<91{Gdqppqql>tTpKRaed>LTegqAS1aShs+5ct*_**s^gt=D0SwT?&U zSikjXJt-i8)}TEwB|+q9DKz%mr4ti-+77zDn{lQu2_Y`2573Rl#NyY|U_bRTYhB6CINi|@;^xvef&49IENy|}o*coXLYdeOn3cDyC z=QuM9lW~aPgh|Un%IL^n^`0-)ql2@}yPIO)hNjNOC5y!A(lO5^`Hv z4sK55aeGx6K0YQGh>xp`CR+pMBvbOVVS{kPN=y15;57~xP^8)=9*Xj1ge6W{PkaQ5 z3mGH;%aLWV0s?54hnJi-2?fddv=yAv?DKeDLw%fkS}N%?(TwCW+N9q8mCb@biei{| zY;>>rgBhD!lE&oGd|syK6s=Z*Gk+`JOj!n@vU;xmsQ0sDlrOBuwSoJ~;Arq_P~kk$SiM-sq^5{BvmP ztB06lQMEkYN$ll2-$T}~m&)6;ois*{={&x-Js=L9sqDDpRc;Nau4}{zq2ijAm?TDZ z9x|dif=s>i#vs}Qz6qDd3~-E@czmtv#2aNiwbknOmo^}XKg=fc8g1}8-rN;UUxc-2 zwEKXR)p~JNU~8L@A*`n?p(AL#8TcGPVI-7`^!*zzn^AtP$ zV-OO#wR0-+QEiYm`7#B~vx(l>$@^K;PHUyJ+kt*Pop9u`Lx;1FBO}xCuPBZo`ZAKc zWrwCK@EkhlBR|%bhKPr~N=z{w1~@EZAqZx)O^-%cNu!}=HgnX35*ml}Im>Rurv9yO z!a^{mWh7)&TtV&e|lnlc5xW>zKM}>*V!b`(Z%#cQkn|SRSC9FyOe;t31q?(4k43iw7w6tOaz_u z3XDKPR27#P#079^>xq=I{j`6!T58(H_$2?cwR&W2l9a^mwA&YE?6n{FS%%h|$M{#~Fjn<6)d->B^Ylsb0_tNFoM&ivn0>b@gzJV=mqgw0VHg8V|b{u$C zcW1O0p9Ghm6^DyXA0BV_*gl8sZw?tM8DX5$i3Z|4vitlX1{X!~{OmU`- zq%;<@i6@Fq&#nU<@EhopU6Z(^7H=jKnr-X{l=-t6>so{<+;^JC6Hpwsh#BoI#VrS|+5qAU_g1*AMzcZm2%X zhVGgV7f^ruVnX=x3diS!d%=N$fl?r*Jo7e+ebU8`_!)_wrWCvRdBPuy_Lh+|(^KT$ z$2w~z$m@B6^x;2S=}8{&WX2CA2&7G$!4x*lo;SuGr*yKEmT_|pD4G5onn?n=$gUV) z$eq)HpE&YfUiIQu9=Dt}zWK-{;|j^(cFpG5(txu!zH&jmE!zfMfUGrD8Hdx?g1l{VX-Flt&fSxZ_BOB)z!5e&|!_VJR0)W8B-Va zfsoH@S==s75lN(M8*T$b2=<#+z%>(aK!Qv1^>wKCNHTw~H=ivRNplVJsA!lU&}=Uf zdrkh*?9Zrz!NQP(wa+l_szrB@Xf*JEHEpkdXWtT|Ehh!j=y0)39ttz-I|hWtA0Xpa z2=gP%Ay#h6>cMNmQf=2fY;{00ypkehYE?zysTu;!L}e=sswGvBL0u z&TgiHaeBjt-COmp`7^p7X>ZMWvVRV(Bk-aLgI#Z<)xy#enI9J8KWFa(xoG+nt8Kg6 z)+UNY-v@}ER>|}0Xvmbe?0XvnnIm>tp+Bn0hhqSf^s$Qn05UO`;hFr5@ocJPOHmZ5b-n<>scJwtRTa<#yLo|4zY2dU6cQW z!GstG4nfJobU%C+!^cPkflsorK>8K*wv(?541)9qoe_*xaE{SYGw!HUSjrM{oqeFi z#RVdYUY^x=tvgiA1;O#*BD$O2{joyT$o;qk++iUIC71@B;?R)76W3nhieaksg{8WJ zGf|T}yZ+l-$2-fS-zY9)n;xMA9afhuBLI0Ud+)*YRuV?uKZ&m{0IYVrUP01`Z7SJL zbA*_%E%>}>YNdTG80V69DLIWnI=#498XpEmit$MD5)-o{Eeqepj8L9E+2k-x15I)0 zT%dR57iScmUvjNZHHV{o9GS{B5UP|KK(TU{BL(Bdkim)`2#P!PkYAIO zA$jrV(j~5LgtufjZjH@o9>^*l9ok#>oh;GhltP>@cCGnj{_`FS3?#(kucGac&)Q%_ zt0lY+-Nc;_UlU6&x)h(vWcsfW6-_9LtV=(piO@*PtU8_mkVChYA^^mL*0 zb`3C+uV$u@i1Ty%v$7S-o#PZ$!Ts&W$Qo5>2&2{1p=?WPg6?$~?WXyXE<)iFDHDxE znxdC{S;OtdNdHHFL^Uuqb!!)z!`avDUw-jMCFuXk72!OcM|L0j$vAH>q1=I>RpiE6 zlR$2tH!ixa?j1HIM7H@3`87+qklp!BRjQHG94@|a_g-|pM=x5mwfsK(?TkkM2XRHO z?|)v#%XLEab(;956`bc#917u+@5&fpN-g|(#DHZa-Y#yY!p(m08WX$i!(d5j`Cbhs zgpSOZ76Bf02wkEdNO3cN7>VS!%$7LX$)cHUA*jZI(~~K#nhi5qt+JVmn71CRjRhQm zgcpGD6Y≪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.open>a, .navbar-default .navbar-nav>.open>a:hover, .navbar-default .navbar-nav>.open>a:focus { color: #FFF; } + + .navbar-brand img { + margin-top: -5px; + max-height: 100%; + } } diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 9e27c1a5..4091792d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -185,7 +185,7 @@ module ApplicationHelper 'OSEM' ) link_to( - link_text, + image_tag('snapcon_logo.png'), root_path, class: 'navbar-brand', title: 'Open Source Event Manager' diff --git a/app/views/layouts/_navigation.html.haml b/app/views/layouts/_navigation.html.haml index e99513d9..9e8c7c4e 100644 --- a/app/views/layouts/_navigation.html.haml +++ b/app/views/layouts/_navigation.html.haml @@ -14,7 +14,7 @@ %span.icon-bar %span.icon-bar %span.icon-bar - = nav_root_link_for conference + = nav_root_link_for(conference) .collapse.navbar-collapse#main-nav - if content_for :splash_nav @@ -42,33 +42,37 @@ = link_to(new_registration_path('user')) do %span.fa.fa-heart Sign Up - %li.dropdown.visible-desktop - %a.dropdown-toggle{"data-toggle" => "dropdown", href: '#'} - %span.fa.fa-user - Sign In - %span.caret - .dropdown-menu - - if ENV['OSEM_ICHAIN_ENABLED'] == 'true' - = form_tag User.ichain_login_url do - = text_field_tag 'username', nil, id: 'user_ichain_email_dd', class: 'form-control', placeholder: 'Username' - = password_field_tag 'password', nil, id: 'user_ichain_password_dd', class: 'form-control', placeholder: 'Password' - %button.btn.btn-success.btn-block Sign in - - else - %div{style: "padding: 6px"} - = form_tag new_user_session_path, class: 'form-group' do - = text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail' - = password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password' - %p.text-right - %small - %label{for: 'user_remember_me'} Remember me - = check_box_tag 'user[remember_me]' - %br - %button.btn.btn-success.btn-block Sign in - - unless omniauth_configured.empty? - .divider - %h6.text-center - or - = render 'devise/shared/openid_links' + %li{class: ""} + = link_to(sign_in_path) do + %span.fa.fa-user + Sign In + -# %li.dropdown.visible-desktop + -# %a.dropdown-toggle{"data-toggle" => "dropdown", href: '#'} + -# %span.fa.fa-user + -# Sign In + -# %span.caret + -# .dropdown-menu + -# - if ENV['OSEM_ICHAIN_ENABLED'] == 'true' + -# = form_tag User.ichain_login_url do + -# = text_field_tag 'username', nil, id: 'user_ichain_email_dd', class: 'form-control', placeholder: 'Username' + -# = password_field_tag 'password', nil, id: 'user_ichain_password_dd', class: 'form-control', placeholder: 'Password' + -# %button.btn.btn-success.btn-block Sign in + -# - else + -# %div{style: "padding: 6px"} + -# = form_tag new_user_session_path, class: 'form-group' do + -# = text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail' + -# = password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password' + -# %p.text-right + -# %small + -# %label{for: 'user_remember_me'} Remember me + -# = check_box_tag 'user[remember_me]' + -# %br + -# %button.btn.btn-success.btn-block Sign in + -# - unless omniauth_configured.empty? + -# .divider + -# %h6.text-center + -# or + -# = render 'devise/shared/openid_links' -# %p.text-right -# %br -# %a.small.btn.btn-xs.btn-default{"data-toggle" => "collapse", "data-target" => "#navbar-devise-help"} From 2fc88b3555c1a3ec7cecb9167f625921e00747a9 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 00:19:50 -0800 Subject: [PATCH 39/61] Order lodgings by created_at. A temporary hack --- app/views/conferences/_lodging.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index 724e78ca..109351fc 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -16,7 +16,7 @@ We recommend the following accommodations for your visit. .row.row-centered - - lodgings.each do |lodging| + - lodgings.order(created_at: :asc).each do |lodging| .col-md-4.col-sm-4.col-centered.col-top .thumbnail - if lodging.picture? From dbeebe50c13dfc8cf8faa8abaed6aa0bce001966 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 00:23:42 -0800 Subject: [PATCH 40/61] make lodiging name a link, too --- app/views/conferences/_lodging.haml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index 109351fc..68a81548 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -36,6 +36,9 @@ %i.fa.fa-home.fa-5x .caption %h3.text-center - = lodging.name + - if lodging.website_link.present? + = link_to(loding.website_link, lodiging.name) + - else + = lodging.name - if lodging.description.present? = markdown(lodging.description) From e59d69a038b7075b520d9042328761fa6d6b1589 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 00:42:20 -0800 Subject: [PATCH 41/61] HACK: allow the registration page to work --- app/controllers/conference_registrations_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/conference_registrations_controller.rb b/app/controllers/conference_registrations_controller.rb index 887d0ce1..9caefd10 100644 --- a/app/controllers/conference_registrations_controller.rb +++ b/app/controllers/conference_registrations_controller.rb @@ -108,7 +108,7 @@ class ConferenceRegistrationsController < ApplicationController end def registration_params - params.require(:registration) + params.permit(:registration) .permit( :conference_id, :volunteer, :accepted_code_of_conduct, From d9155da176372303bb88e1e1da3568475771cc05 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 02:26:32 -0800 Subject: [PATCH 42/61] fix typo --- app/views/conferences/_lodging.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index 68a81548..f5ba0789 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -37,7 +37,7 @@ .caption %h3.text-center - if lodging.website_link.present? - = link_to(loding.website_link, lodiging.name) + = link_to(lodging.website_link, lodiging.name) - else = lodging.name - if lodging.description.present? From bea9f79544c429077a6dfd8938fe4a3312e8ecc5 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 02:31:38 -0800 Subject: [PATCH 43/61] ARRRGHHH, another typo...same line... --- app/views/conferences/_lodging.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index f5ba0789..a776a37e 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -37,7 +37,7 @@ .caption %h3.text-center - if lodging.website_link.present? - = link_to(lodging.website_link, lodiging.name) + = link_to(lodging.website_link, lodging.name) - else = lodging.name - if lodging.description.present? From 1bcf1b8f0608ed33c5ca55ffe410dcbd643b1546 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 02:47:33 -0800 Subject: [PATCH 44/61] dumb...fix order of link_to args --- app/views/conferences/_lodging.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index a776a37e..55a286db 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -37,7 +37,7 @@ .caption %h3.text-center - if lodging.website_link.present? - = link_to(lodging.website_link, lodging.name) + = link_to(lodging.name, lodging.website_link) - else = lodging.name - if lodging.description.present? From 16d2d8c4f0807e54ba3106e1927f560c711b3b84 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 15:38:00 -0800 Subject: [PATCH 45/61] Cleanup CSS ordering, fix coloring for navdropdowns --- app/assets/stylesheets/application.css | 13 +++++++------ app/assets/stylesheets/osem-navbar.scss | 11 +++++++++-- app/assets/stylesheets/strap-on.scss | 4 ++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 567fa050..0b80bc19 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2,6 +2,13 @@ *= require strap-on *= require formtastic-bootstrap *= require dataTables/bootstrap/3/jquery.dataTables.bootstrap + *= require selectize + *= require selectize.bootstrap3 + *= require bootstrap-select + *= require bootstrap-markdown + *= require bootstrap-datetimepicker + *= require leaflet + *= require osem *= require osem-rating *= require osem-schedule @@ -10,15 +17,9 @@ *= require osem-splash *= require font-awesome *= require osem-fonts - *= require bootstrap-markdown - *= require bootstrap-datetimepicker - *= require leaflet *= require bootstrap3-switch *= require osem-payments *= require osem-navbar - *= require selectize - *= require selectize.bootstrap3 *= require mastodon - *= require bootstrap-select *= require conferences */ diff --git a/app/assets/stylesheets/osem-navbar.scss b/app/assets/stylesheets/osem-navbar.scss index 1bdeb223..2f6458be 100644 --- a/app/assets/stylesheets/osem-navbar.scss +++ b/app/assets/stylesheets/osem-navbar.scss @@ -1,4 +1,6 @@ @import "breakpoints.scss"; +$navbar-default-link-color: #FFF; + .nav-osem { border: none; @include breakpoint(xs) { @@ -31,8 +33,13 @@ .dropdown-menu { min-width: 225px; } - .navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:hover, .navbar-default .navbar-nav>.open>a:focus { - color: #FFF; + + &.navbar-default { + .navbar-nav > .open > a { + &:hover, &:focus { + color: $navbar-default-link-color; + } + } } .navbar-brand img { diff --git a/app/assets/stylesheets/strap-on.scss b/app/assets/stylesheets/strap-on.scss index da70029d..0a9c3908 100644 --- a/app/assets/stylesheets/strap-on.scss +++ b/app/assets/stylesheets/strap-on.scss @@ -1,8 +1,8 @@ $navbar-default-bg: #0C3559; $navbar-default-link-active-bg: rgb(8,8,8); $navbar-default-border: 1px solid #d4d4d4; -$navbar-default-color: #ffffff; -$navbar-default-link-color: #ffffff; +$navbar-default-color: #FFF; +$navbar-default-link-color: #FFF; $navbar-default-link-hover-color: #F2E205; @import 'bootstrap-datetimepicker'; From bff830ec55aa1eeaeda9620dda1bcafffd5039b1 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 15:38:17 -0800 Subject: [PATCH 46/61] Support markdown in more fields --- app/views/admin/event_types/_form.html.haml | 5 +++-- app/views/admin/event_types/index.html.haml | 2 +- app/views/proposals/new.html.haml | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/views/admin/event_types/_form.html.haml b/app/views/admin/event_types/_form.html.haml index 29fac398..49b82478 100644 --- a/app/views/admin/event_types/_form.html.haml +++ b/app/views/admin/event_types/_form.html.haml @@ -8,10 +8,11 @@ = @event_type.title .row .col-md-12 - = semantic_form_for(@event_type, url: (@event_type.new_record? ? admin_conference_program_event_types_path : admin_conference_program_event_type_path(@conference.short_title, @event_type))) do |f| + - form_url = (@event_type.new_record? ? admin_conference_program_event_types_path : admin_conference_program_event_type_path(@conference.short_title, @event_type)) + = semantic_form_for(@event_type, url: form_url) do |f| = f.input :title, input_html: { autofocus: true } = f.input :length, input_html: {size: 3, type: 'number', step: @event_type.program.schedule_interval, min: @event_type.program.schedule_interval} - = f.input :description + = f.input :description, as: :text, hint: markdown_hint, input_html: { rows: 5, data: { provide: 'markdown-editable' } } = f.input :minimum_abstract_length, input_html: {size: 3} = f.input :maximum_abstract_length, input_html: {size: 3} = f.input :color, input_html: { size: 6, type: 'color' } diff --git a/app/views/admin/event_types/index.html.haml b/app/views/admin/event_types/index.html.haml index 4d3c27b8..e18cceeb 100644 --- a/app/views/admin/event_types/index.html.haml +++ b/app/views/admin/event_types/index.html.haml @@ -20,7 +20,7 @@ %td = event_type.title %td - = event_type.description + = markdown(event_type.description) %td = event_type.length Minutes diff --git a/app/views/proposals/new.html.haml b/app/views/proposals/new.html.haml index 7885f990..bab6eebd 100644 --- a/app/views/proposals/new.html.haml +++ b/app/views/proposals/new.html.haml @@ -7,7 +7,7 @@ - if @program.cfp.description.present? .row .col-md-12 - = markdown(@program.cfp.description) + = markdown(@program.cfp.description, escape_html=false) .row .col-md-12 = render partial: 'encouragement_text' @@ -43,10 +43,10 @@ - @program.event_types.each do |event_type| %span{ class: 'help-block event_event_type_id collapse', id: "#{event_type.id}-help" } - = event_type.description + = markdown(event_type.description) = f.input :abstract, required: true, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, - hint: markdown_hint('[Tips to improve your presentations.](http://blog.hubspot.com/blog/tabid/6307/bid/5975/10-Rules-to-Instantly-Improve-Your-Presentations.aspx)') + hint: markdown_hint %p You have used From 2c9645895e095775b3789e36d42d6a49af17dd4f Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 15:47:10 -0800 Subject: [PATCH 47/61] Make the edit form not so wide. --- app/views/admin/event_types/_form.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/event_types/_form.html.haml b/app/views/admin/event_types/_form.html.haml index 49b82478..91533877 100644 --- a/app/views/admin/event_types/_form.html.haml +++ b/app/views/admin/event_types/_form.html.haml @@ -7,7 +7,7 @@ Event Type = @event_type.title .row - .col-md-12 + .col-md-8 - form_url = (@event_type.new_record? ? admin_conference_program_event_types_path : admin_conference_program_event_type_path(@conference.short_title, @event_type)) = semantic_form_for(@event_type, url: form_url) do |f| = f.input :title, input_html: { autofocus: true } From 7553c15e5e3cec25fa359a1d83c732031d50afce Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 16:06:51 -0800 Subject: [PATCH 48/61] CSS tweaks... --- app/assets/stylesheets/osem.scss | 3 ++- app/views/conferences/_header.haml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/osem.scss b/app/assets/stylesheets/osem.scss index c48be11d..55632cec 100644 --- a/app/assets/stylesheets/osem.scss +++ b/app/assets/stylesheets/osem.scss @@ -7,9 +7,10 @@ html { body { /* Margin bottom by 2 times the footer height */ - margin-bottom: 60px; + margin-bottom: 85px; /* Margin bottom by navbar height */ padding-top: 60px; + font-size: 16px; } #content { diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index 23d6b4eb..cb45bb5e 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -2,14 +2,14 @@ #banner{ style: ("background-image: url(#{conference.picture_url})" if conference.picture_url) } .container .row - .col-md-8.col-md-offset-2#header + .col-md-6.col-md-offset-3#header .row -# - if conference.picture? -# .col-md-4 -# = image_tag(conference.picture_url, -# class: 'img-responsive img-center', -# id: 'splash-logo') - .col-md-8.col-md-offset-2 + .col-md-8 %h1 = conference.title.html_safe %h3 From 9a811b4a6cde3c87ea0b9b445fe653154cc37cdb Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 16:16:18 -0800 Subject: [PATCH 49/61] Update lodging styling. Add description for venu when map is shown. --- app/views/conferences/_lodging.haml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index 55a286db..2088721d 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -5,6 +5,10 @@ - cache [venue, lodgings, '#splash#lodging'] do %section#lodging .container + - if venue.location? and venue.description.present? + .row + .col-md-8.col-md-offset-2 + = markdown(venue.description, escape_html=false) .row .col-md-12.text-center %h2 @@ -17,7 +21,7 @@ .row.row-centered - lodgings.order(created_at: :asc).each do |lodging| - .col-md-4.col-sm-4.col-centered.col-top + .col-md-6.col-sm-4.col-centered.col-top .thumbnail - if lodging.picture? - if lodging.website_link.present? From 722bd8c008e8f2ed3df5a37c507602d6ed2768a2 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 16:21:15 -0800 Subject: [PATCH 50/61] Move the venue description to below the map. --- app/views/conferences/_lodging.haml | 4 ---- app/views/conferences/_venue.haml | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index 2088721d..7306b962 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -5,10 +5,6 @@ - cache [venue, lodgings, '#splash#lodging'] do %section#lodging .container - - if venue.location? and venue.description.present? - .row - .col-md-8.col-md-offset-2 - = markdown(venue.description, escape_html=false) .row .col-md-12.text-center %h2 diff --git a/app/views/conferences/_venue.haml b/app/views/conferences/_venue.haml index fbdcde48..69c5cd31 100644 --- a/app/views/conferences/_venue.haml +++ b/app/views/conferences/_venue.haml @@ -5,6 +5,11 @@ %section#venue - if venue.location? = render '/conferences/venue_map', venue: venue + - if venue.description.present? + .container + .row + .col-md-8.col-md-offset-2 + = markdown(venue.description, escape_html=false) - else - cache [venue, commercial, '#splash#venue'] do .container From 350371f79d07600cc1efe2d83cee50f0c0cf83c3 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Tue, 7 Jan 2020 23:58:25 -0800 Subject: [PATCH 51/61] Tweak CSS, fix loding order --- app/assets/stylesheets/osem-splash.scss | 14 +++++++++++--- app/assets/stylesheets/osem.scss | 2 +- app/controllers/conferences_controller.rb | 2 +- app/views/conferences/_lodging.haml | 2 +- app/views/conferences/_tickets.haml | 7 ++++--- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/osem-splash.scss b/app/assets/stylesheets/osem-splash.scss index a1c29c0c..40b4b5c1 100644 --- a/app/assets/stylesheets/osem-splash.scss +++ b/app/assets/stylesheets/osem-splash.scss @@ -9,12 +9,12 @@ } section:nth-child(even) { - background: none repeat scroll 0 0 #e0e0e0; - color: #555; + background: none repeat scroll 0 0 #eee; + color: #333; } section:nth-child(odd) { background: none repeat scroll 0 0 #ffffff; - color: #7b7b7b; + color: #333; .thumbnail { background: none repeat scroll 0 0 #e0e0e0; } @@ -93,6 +93,14 @@ } } + #tickets { + a { + &:hover, &:focus { + text-decoration: none; + } + } + } + #sponsors { .img-sponsor { max-height: 100px; diff --git a/app/assets/stylesheets/osem.scss b/app/assets/stylesheets/osem.scss index 55632cec..65598add 100644 --- a/app/assets/stylesheets/osem.scss +++ b/app/assets/stylesheets/osem.scss @@ -14,7 +14,7 @@ body { } #content { - padding-bottom: 45px; + padding-bottom: 60px; } #footer { diff --git a/app/controllers/conferences_controller.rb b/app/controllers/conferences_controller.rb index 035ab366..21c5045f 100644 --- a/app/controllers/conferences_controller.rb +++ b/app/controllers/conferences_controller.rb @@ -54,7 +54,7 @@ class ConferencesController < ApplicationController @tickets = @conference.tickets.order('price_cents') end if splashpage.include_lodgings - @lodgings = @conference.lodgings.order('name') + @lodgings = @conference.lodgings.order('id') end if splashpage.include_sponsors @sponsorship_levels = @conference.sponsorship_levels.eager_load( diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index 7306b962..4253b2e1 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -16,7 +16,7 @@ We recommend the following accommodations for your visit. .row.row-centered - - lodgings.order(created_at: :asc).each do |lodging| + - lodgings.each do |lodging| .col-md-6.col-sm-4.col-centered.col-top .thumbnail - if lodging.picture? diff --git a/app/views/conferences/_tickets.haml b/app/views/conferences/_tickets.haml index 5f0da517..d1900f1e 100644 --- a/app/views/conferences/_tickets.haml +++ b/app/views/conferences/_tickets.haml @@ -7,9 +7,10 @@ .container .row .col-md-12.text-center - %h2 - Support - = conference.title + %h3 Sign Up for Campus Housing + -# %h2 + -# Support + -# = conference.title .row.row-centered - tickets.each do |ticket| .col-md-3.col-sm-3.col-centered.col-top From 0b512b13858f1a061a4498afc4dc37bb49c4af3f Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Wed, 8 Jan 2020 00:07:25 -0800 Subject: [PATCH 52/61] Show reg status for tickets. --- app/views/physical_tickets/index.html.haml | 2 ++ app/views/tickets/_ticket.html.haml | 6 +++--- app/views/tickets/index.html.haml | 6 ++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/physical_tickets/index.html.haml b/app/views/physical_tickets/index.html.haml index 2ded8115..e8adbc80 100644 --- a/app/views/physical_tickets/index.html.haml +++ b/app/views/physical_tickets/index.html.haml @@ -16,6 +16,7 @@ %th ID %th Type %th User + %th Registration? %th Actions %tbody - @physical_tickets.each do |physical_ticket| @@ -23,6 +24,7 @@ %td= physical_ticket.id %td= physical_ticket.ticket.title %td= physical_ticket.user.name + %td= physical_ticket.ticket.registration_ticket? ? 'Yes' : 'No' %td .btn-group = link_to 'Show', diff --git a/app/views/tickets/_ticket.html.haml b/app/views/tickets/_ticket.html.haml index 501e4151..052bc9e9 100644 --- a/app/views/tickets/_ticket.html.haml +++ b/app/views/tickets/_ticket.html.haml @@ -3,9 +3,9 @@ .media .media-body %h4.media-heading= ticket.title - %h5.media-heading= markdown(ticket.description) - - if @conference.tickets.for_registration.any? - %td.col-sm-1.col-md-2.text-center + .media-heading= markdown(ticket.description) + %td.col-sm-1.col-md-2 + %span.text-center = ticket.registration_ticket? ? 'Yes' : 'No' %td.col-sm-1.col-md-1 :ruby diff --git a/app/views/tickets/index.html.haml b/app/views/tickets/index.html.haml index e157d75e..a7e4a03c 100644 --- a/app/views/tickets/index.html.haml +++ b/app/views/tickets/index.html.haml @@ -13,8 +13,7 @@ %thead %tr %th Ticket - - if @conference.tickets.for_registration.any? - %th Registration Ticket + %th Registration? %th Quantity %th Price %th Total @@ -23,8 +22,7 @@ = render 'ticket', f: f, ticket: ticket %tr %td - - if @conference.tickets.for_registration.any? - %td + %td %td %td.col-sm-1.col-md-1.text-center %h4 From e9b1086f13927f9b9593198ce12ed6e3bbc006c2 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Wed, 8 Jan 2020 01:20:18 -0800 Subject: [PATCH 53/61] Tidy up the look of lodging panels --- app/views/conferences/_lodging.haml | 4 ++-- app/views/conferences/_tickets.haml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index 4253b2e1..cac56ec4 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -21,7 +21,7 @@ .thumbnail - if lodging.picture? - if lodging.website_link.present? - = link_to(lodging.website_link, class: 'thumbnail') do + = link_to(lodging.website_link) do = image_tag lodging.picture.large.url, class: 'img-responsive img-lodging' - else @@ -30,7 +30,7 @@ - else %p.text-center - if lodging.website_link.present? - = link_to(lodging.website_link, class: 'thumbnail') do + = link_to(lodging.website_link) do %i.fa.fa-home.fa-5x - else %i.fa.fa-home.fa-5x diff --git a/app/views/conferences/_tickets.haml b/app/views/conferences/_tickets.haml index d1900f1e..2b364afc 100644 --- a/app/views/conferences/_tickets.haml +++ b/app/views/conferences/_tickets.haml @@ -7,7 +7,8 @@ .container .row .col-md-12.text-center - %h3 Sign Up for Campus Housing + %h2 Sign Up for Campus Housing + %br -# %h2 -# Support -# = conference.title From 843bd60026b1c8dc9add85d894ddbf3fb7c6a570 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Wed, 8 Jan 2020 01:47:27 -0800 Subject: [PATCH 54/61] Text with drop shadow for now --- app/assets/stylesheets/osem-splash.scss | 7 ++++++- app/views/conferences/_header.haml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/osem-splash.scss b/app/assets/stylesheets/osem-splash.scss index 40b4b5c1..56df6f51 100644 --- a/app/assets/stylesheets/osem-splash.scss +++ b/app/assets/stylesheets/osem-splash.scss @@ -32,11 +32,16 @@ padding-top: 100px; padding-bottom: 100px; .container { - #header { + #header-no-image { background-color: rgba(224, 224, 224,.80); padding-top: 20px; padding-bottom: 20px; } + + #header-image { + color: #FFF; + text-shadow: 1px 1px 3px #ddd; + } } } diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index cb45bb5e..71c63490 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -2,7 +2,7 @@ #banner{ style: ("background-image: url(#{conference.picture_url})" if conference.picture_url) } .container .row - .col-md-6.col-md-offset-3#header + .col-md-6.col-md-offset-3{id: (conference.picture? ? "header-image" : "header-no-image")} .row -# - if conference.picture? -# .col-md-4 From debefc307afa8004e0edac284c48a5bf3fc1d063 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Wed, 8 Jan 2020 02:01:43 -0800 Subject: [PATCH 55/61] No dropshadow --- app/assets/stylesheets/osem-splash.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/osem-splash.scss b/app/assets/stylesheets/osem-splash.scss index 56df6f51..cb3b567c 100644 --- a/app/assets/stylesheets/osem-splash.scss +++ b/app/assets/stylesheets/osem-splash.scss @@ -40,7 +40,7 @@ #header-image { color: #FFF; - text-shadow: 1px 1px 3px #ddd; + // text-shadow: 1px 1px 3px #ddd; } } } From 0b7085291f9f2132cef91cff6beb48ff6cb157ff Mon Sep 17 00:00:00 2001 From: Lauren Mock Date: Wed, 8 Jan 2020 10:52:03 -0800 Subject: [PATCH 56/61] hide venue link if there is no venue link --- app/views/conferences/_header.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index cb45bb5e..7b662377 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -18,7 +18,7 @@ = date_string(conference.start_date, conference.end_date) - if conference.venue %span.venue.text-nowrap - - if venue.website + - if venue.website.present? = sanitize link_to(venue.name, venue.website) - else = venue.city From 843ec586ed286675d933593b6ecc653a4d5308b4 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Wed, 8 Jan 2020 23:18:03 -0800 Subject: [PATCH 57/61] Cleanup CSS add Snap! style block attachments --- app/assets/stylesheets/osem-navbar.scss | 6 +++++- app/assets/stylesheets/osem-schedule.scss | 5 ++--- app/assets/stylesheets/osem-splash.scss | 18 +++++++++++++++++- app/assets/stylesheets/osem-variables.scss | 14 ++++++++++++++ app/assets/stylesheets/osem.scss | 16 ++++++++++++++++ app/assets/stylesheets/strap-on.scss | 9 ++------- app/views/conferences/_call_for_content.haml | 1 + app/views/conferences/_header.haml | 5 +++-- app/views/conferences/_lodging.haml | 1 + app/views/conferences/_program.haml | 1 + app/views/conferences/_registration.haml | 1 + app/views/conferences/_social_media.haml | 1 + app/views/conferences/_sponsors.haml | 1 + app/views/conferences/_tickets.haml | 5 +++-- app/views/conferences/_venue.haml | 2 ++ app/views/layouts/_navigation.html.haml | 4 ++-- 16 files changed, 72 insertions(+), 18 deletions(-) create mode 100644 app/assets/stylesheets/osem-variables.scss diff --git a/app/assets/stylesheets/osem-navbar.scss b/app/assets/stylesheets/osem-navbar.scss index 2f6458be..89aa2dce 100644 --- a/app/assets/stylesheets/osem-navbar.scss +++ b/app/assets/stylesheets/osem-navbar.scss @@ -1,5 +1,5 @@ @import "breakpoints.scss"; -$navbar-default-link-color: #FFF; +@import "osem-variables.scss"; .nav-osem { border: none; @@ -46,4 +46,8 @@ $navbar-default-link-color: #FFF; margin-top: -5px; max-height: 100%; } + + .trapezoid { + border-top-color: $navbar-default-bg; + } } diff --git a/app/assets/stylesheets/osem-schedule.scss b/app/assets/stylesheets/osem-schedule.scss index 1cf1efec..b7c4e3ac 100644 --- a/app/assets/stylesheets/osem-schedule.scss +++ b/app/assets/stylesheets/osem-schedule.scss @@ -64,9 +64,8 @@ #schedule td.event { background-image: linear-gradient(to top, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%); - -cursor: pointer; -padding: 3px 2px; + cursor: pointer; + padding: 3px 2px; } #schedule td.event:hover diff --git a/app/assets/stylesheets/osem-splash.scss b/app/assets/stylesheets/osem-splash.scss index cb3b567c..e2bdda65 100644 --- a/app/assets/stylesheets/osem-splash.scss +++ b/app/assets/stylesheets/osem-splash.scss @@ -1,4 +1,5 @@ @import "breakpoints.scss"; +@import "osem-variables.scss"; #splash { // Counter the general padding for #content @@ -6,11 +7,19 @@ section { padding-top: 60px; padding-bottom: 60px; + + .trapezoid { + top: 60px + $trapezoid-height; + } } section:nth-child(even) { background: none repeat scroll 0 0 #eee; color: #333; + + .trapezoid { + border-top-color: #eee; + } } section:nth-child(odd) { background: none repeat scroll 0 0 #ffffff; @@ -18,6 +27,10 @@ .thumbnail { background: none repeat scroll 0 0 #e0e0e0; } + + .trapezoid { + border-top-color: #fff; + } } .cta-button { @@ -40,7 +53,6 @@ #header-image { color: #FFF; - // text-shadow: 1px 1px 3px #ddd; } } } @@ -72,6 +84,10 @@ #venue-pic { margin-top: 20px; } + // The venue section has less padding. + .trapezoid { + top: $trapezoid-height; + } } #lodging { diff --git a/app/assets/stylesheets/osem-variables.scss b/app/assets/stylesheets/osem-variables.scss new file mode 100644 index 00000000..1ae23c03 --- /dev/null +++ b/app/assets/stylesheets/osem-variables.scss @@ -0,0 +1,14 @@ +// This file is included *early* in CSS order! +// These variables change bootstrap defaults. + +$navbar-default-bg: #0C3559; +$navbar-default-link-active-bg: rgb(8,8,8); +$navbar-default-border: 1px solid #d4d4d4; +$navbar-default-color: #FFF; +$navbar-default-link-color: #FFF; +$navbar-default-link-hover-color: #F2E205; +$navbar-default-link-active-hover-color: #FFF; + + +// The hiegh of the section tabs that are like Snap! blocks. +$trapezoid-height: 14px; diff --git a/app/assets/stylesheets/osem.scss b/app/assets/stylesheets/osem.scss index 65598add..bcf37d4f 100644 --- a/app/assets/stylesheets/osem.scss +++ b/app/assets/stylesheets/osem.scss @@ -1,3 +1,4 @@ +@import "osem-variables"; @import "bootstrap/mixins"; html { @@ -17,6 +18,21 @@ body { padding-bottom: 60px; } +// Designed to be the last element in a section / nav +// Makes a little "puzzle piece" connector. +.trapezoid { + position: relative; + margin-left: 60px; + border-top: $trapezoid-height solid; + border-left: 9px solid transparent; + border-right: 9px solid transparent; + height: 0; + width: 64px; + margin-top: -1 * $trapezoid-height; + top: $trapezoid-height; + z-index: 1000; +} + #footer { position: absolute; bottom: 0; diff --git a/app/assets/stylesheets/strap-on.scss b/app/assets/stylesheets/strap-on.scss index 0a9c3908..69538d2e 100644 --- a/app/assets/stylesheets/strap-on.scss +++ b/app/assets/stylesheets/strap-on.scss @@ -1,10 +1,5 @@ -$navbar-default-bg: #0C3559; -$navbar-default-link-active-bg: rgb(8,8,8); -$navbar-default-border: 1px solid #d4d4d4; -$navbar-default-color: #FFF; -$navbar-default-link-color: #FFF; -$navbar-default-link-hover-color: #F2E205; - +// Place bootstrap variable customizations in the file below. +@import "osem-variables"; @import 'bootstrap-datetimepicker'; @import "bootstrap-sprockets"; diff --git a/app/views/conferences/_call_for_content.haml b/app/views/conferences/_call_for_content.haml index 6fab5dc6..57cd9dc8 100644 --- a/app/views/conferences/_call_for_content.haml +++ b/app/views/conferences/_call_for_content.haml @@ -20,3 +20,4 @@ call: call_for_booths - if two_calls_open(call_for_events, call_for_tracks, call_for_booths) .col-md-2.col-sm-2.hidden-xs   + .trapezoid diff --git a/app/views/conferences/_header.haml b/app/views/conferences/_header.haml index 71c63490..7edf2afd 100644 --- a/app/views/conferences/_header.haml +++ b/app/views/conferences/_header.haml @@ -18,11 +18,11 @@ = date_string(conference.start_date, conference.end_date) - if conference.venue %span.venue.text-nowrap - - if venue.website + - if venue.website.present? = sanitize link_to(venue.name, venue.website) - else = venue.city - - if venue.country_name != 'US' + - if venue.country != 'US' • = venue.country_name @@ -32,3 +32,4 @@ .row .col-md-8.col-md-offset-2 = markdown(conference.description) + .trapezoid diff --git a/app/views/conferences/_lodging.haml b/app/views/conferences/_lodging.haml index cac56ec4..fcffbff8 100644 --- a/app/views/conferences/_lodging.haml +++ b/app/views/conferences/_lodging.haml @@ -42,3 +42,4 @@ = lodging.name - if lodging.description.present? = markdown(lodging.description) + .trapezoid diff --git a/app/views/conferences/_program.haml b/app/views/conferences/_program.haml index 3789f8a2..2998c2f0 100644 --- a/app/views/conferences/_program.haml +++ b/app/views/conferences/_program.haml @@ -31,6 +31,7 @@ = link_to(conference_schedule_path(conference.short_title), class: 'btn btn-success btn-lg') do Full Schedule + .trapezoid - unless booths.blank? - booths.each do |booth| diff --git a/app/views/conferences/_registration.haml b/app/views/conferences/_registration.haml index 51258f15..468b8b38 100644 --- a/app/views/conferences/_registration.haml +++ b/app/views/conferences/_registration.haml @@ -37,3 +37,4 @@ = link_to('Register Now', new_conference_conference_registration_path(conference_id), class: 'btn btn-lg btn-success') + .trapezoid diff --git a/app/views/conferences/_social_media.haml b/app/views/conferences/_social_media.haml index ea5c481d..ebbfb8e1 100644 --- a/app/views/conferences/_social_media.haml +++ b/app/views/conferences/_social_media.haml @@ -27,3 +27,4 @@ - if contact.email? = mail_to "#{ contact.email }" do %i.fa.fa-envelope-o.fa-4x + .trapezoid diff --git a/app/views/conferences/_sponsors.haml b/app/views/conferences/_sponsors.haml index ba74c331..0bd5edb0 100644 --- a/app/views/conferences/_sponsors.haml +++ b/app/views/conferences/_sponsors.haml @@ -30,6 +30,7 @@ = "Interested in sponsoring #{conference.title}?" = link_to(sponsorship_mailto(conference)) do Please, contact us! + .trapezoid - sponsors.each do |sponsor| - content_for :modals do diff --git a/app/views/conferences/_tickets.haml b/app/views/conferences/_tickets.haml index 2b364afc..1250266e 100644 --- a/app/views/conferences/_tickets.haml +++ b/app/views/conferences/_tickets.haml @@ -14,7 +14,7 @@ -# = conference.title .row.row-centered - tickets.each do |ticket| - .col-md-3.col-sm-3.col-centered.col-top + .col-lg-4.col-md-3.col-sm-3.col-centered.col-top = link_to(conference_tickets_path(conference.short_title), class: 'thumbnail') do .caption @@ -23,5 +23,6 @@ .word_break = markdown(ticket.description) %button.btn-block.btn.btn-lg.btn-success - %i.fa.fa-ticket.fa-fw + %i.fa.fa-ticket.fa-fw{"aria-hidden": true} = humanized_money_with_symbol(ticket.price) + .trapezoid diff --git a/app/views/conferences/_venue.haml b/app/views/conferences/_venue.haml index 69c5cd31..aae6b43d 100644 --- a/app/views/conferences/_venue.haml +++ b/app/views/conferences/_venue.haml @@ -10,6 +10,7 @@ .row .col-md-8.col-md-offset-2 = markdown(venue.description, escape_html=false) + .trapezoid - else - cache [venue, commercial, '#splash#venue'] do .container @@ -46,3 +47,4 @@ - if venue.website %br = sanitize link_to(h(venue.website), h(venue.website)) + .trapezoid diff --git a/app/views/layouts/_navigation.html.haml b/app/views/layouts/_navigation.html.haml index 9e8c7c4e..ddc8634a 100644 --- a/app/views/layouts/_navigation.html.haml +++ b/app/views/layouts/_navigation.html.haml @@ -1,7 +1,6 @@ -.navbar.navbar-default.navbar-fixed-top.nav-osem{role: 'navigation'} +%nav.navbar.navbar-default.navbar-fixed-top.nav-osem{role: 'navigation'} .container .navbar-header - - if controller.class.name.split("::").first=="Admin" %button{ "data-target"=>"#side-nav", "data-toggle"=>"collapse", class: 'navbar-toggle side-nav-btn', type: 'button' } %span.sr-only Toggle navigation @@ -79,3 +78,4 @@ -# Need Help? -# #navbar-devise-help.collapse -# = render 'devise/shared/links' + .trapezoid From 1f7877ccd94b4c4e173e508bd9874b81bd0fe941 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Thu, 9 Jan 2020 01:13:27 -0800 Subject: [PATCH 58/61] Re-order Conference Associations The current order leads to an error on the route GET /conferences/:short_name/physical_tickets The Rails error message was rather helpful! :grin: ``` Completed 500 Internal Server Error in 35ms (ActiveRecord: 12.0ms) ActiveRecord::HasManyThroughOrderError (Cannot have a has_many :through association 'Conference#physical_tickets' which goes through 'Conference#ticket_purchases' before the through association is defined.): app/controllers/admin/physical_tickets_controller.rb:11:in `index' ``` --- app/models/conference.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/conference.rb b/app/models/conference.rb index be3c36ad..c48dcf02 100644 --- a/app/models/conference.rb +++ b/app/models/conference.rb @@ -25,8 +25,8 @@ class Conference < ApplicationRecord has_one :email_settings, dependent: :destroy has_one :program, dependent: :destroy has_one :venue, dependent: :destroy - has_many :physical_tickets, through: :ticket_purchases has_many :ticket_purchases, dependent: :destroy + has_many :physical_tickets, through: :ticket_purchases has_many :payments, dependent: :destroy has_many :supporters, through: :ticket_purchases, source: :user has_many :tickets, dependent: :destroy From 9a1739e86e9614a0c06bd33832637ec867cd7a9c Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Sat, 18 Jan 2020 10:57:42 -0800 Subject: [PATCH 59/61] UI -- Repalce "Commerials" with "Materials". This only replaces the UI facing wording. Specs will fail as they have not been updated yet. --- app/controllers/admin/commercials_controller.rb | 6 +++--- app/views/admin/commercials/index.html.haml | 2 +- app/views/admin/events/index.html.haml | 6 +++--- app/views/admin/events/show.html.haml | 2 +- .../admin/reports/_events_without_commercials.html.haml | 2 +- app/views/admin/venues/_form.html.haml | 2 +- app/views/layouts/_admin_sidebar.html.haml | 2 +- app/views/proposals/_form.html.haml | 6 +++--- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/controllers/admin/commercials_controller.rb b/app/controllers/admin/commercials_controller.rb index e361086d..17d1dcf1 100644 --- a/app/controllers/admin/commercials_controller.rb +++ b/app/controllers/admin/commercials_controller.rb @@ -39,7 +39,7 @@ module Admin def destroy @commercial.destroy - redirect_to admin_conference_commercials_path, notice: 'Commercial was successfully destroyed.' + redirect_to admin_conference_commercials_path, notice: 'Materaisl were successfully removed.' end def render_commercial @@ -60,9 +60,9 @@ module Admin errors = Commercial.read_file(params[:file]) if params[:file] if !params[:file] - flash[:error] = 'Empty file detected while adding commercials to Event' + flash[:error] = 'Empty file detected while adding materials to Event' elsif errors.all? { |_k, v| v.blank? } - flash[:notice] = 'Successfully added commercials.' + flash[:notice] = 'Successfully added materials.' else errors_text = '' errors_text << 'Unable to find event with ID: ' + errors[:no_event].join(', ') + '. ' if errors[:no_event].any? diff --git a/app/views/admin/commercials/index.html.haml b/app/views/admin/commercials/index.html.haml index 095ddad2..8c367ab9 100644 --- a/app/views/admin/commercials/index.html.haml +++ b/app/views/admin/commercials/index.html.haml @@ -1,7 +1,7 @@ .row .col-md-12 .page-header - %h1 Commercials + %h1 Session Materials %p.text-muted Conference commercials will be displayed on the events in the = link_to 'schedule,', conference_schedule_path(@conference.short_title) diff --git a/app/views/admin/events/index.html.haml b/app/views/admin/events/index.html.haml index 4944d946..c766a7a6 100644 --- a/app/views/admin/events/index.html.haml +++ b/app/views/admin/events/index.html.haml @@ -6,9 +6,9 @@ = "(#{@events.length})" if @events.any? .btn-group.pull-right - %button.btn.btn-primary{ title: 'Mass import of commercials for events', + %button.btn.btn-primary{ title: 'Mass import of materials for events', data: { toggle: 'modal', target: '#mass-commercials-modal' } } - Add Commercials + Add Materials - if can? :create, Event = link_to 'Add Event', @@ -28,7 +28,7 @@ .modal-dialog .modal-content .modal-header - %h1 Add commercials to events + %h1 Add materials to events .text-muted Upload your file with data in the following format: %b Event_ID:Commercial_Link diff --git a/app/views/admin/events/show.html.haml b/app/views/admin/events/show.html.haml index 4b764838..ff341db4 100644 --- a/app/views/admin/events/show.html.haml +++ b/app/views/admin/events/show.html.haml @@ -11,7 +11,7 @@ - progress_status = @event.progress_status = progress_status.reject{ |_key, value| value || value.nil? }.length %li - = link_to 'Commercials', '#proposal-commercials', 'data-toggle' => 'tab' + = link_to 'Materials', '#proposal-commercials', 'data-toggle' => 'tab' .tab-content #proposal-content.tab-pane.active diff --git a/app/views/admin/reports/_events_without_commercials.html.haml b/app/views/admin/reports/_events_without_commercials.html.haml index 8f26cb99..025c0117 100644 --- a/app/views/admin/reports/_events_without_commercials.html.haml +++ b/app/views/admin/reports/_events_without_commercials.html.haml @@ -2,7 +2,7 @@ .col-md-12 .page-header %h1 - Events without commercials + Events Without Materials = "(#{@events_missing_commercial.length})" %p.text-muted All submissions that have no commercial diff --git a/app/views/admin/venues/_form.html.haml b/app/views/admin/venues/_form.html.haml index 6674305b..6f64de48 100644 --- a/app/views/admin/venues/_form.html.haml +++ b/app/views/admin/venues/_form.html.haml @@ -7,7 +7,7 @@ %li.active = link_to 'Details', '#details-content', 'data-toggle' => 'tab' %li - = link_to 'Commercials', '#commercials-content', 'data-toggle' => 'tab' + = link_to 'Materials', '#commercials-content', 'data-toggle' => 'tab' .tab-content #details-content.tab-pane.active diff --git a/app/views/layouts/_admin_sidebar.html.haml b/app/views/layouts/_admin_sidebar.html.haml index 78523bc7..78b6da07 100644 --- a/app/views/layouts/_admin_sidebar.html.haml +++ b/app/views/layouts/_admin_sidebar.html.haml @@ -43,7 +43,7 @@ = link_to 'Contact', edit_admin_conference_contact_path(@conference.short_title) - if can? :index, @conference.commercials.build %li{class: "#{active_nav_li(admin_conference_commercials_path(@conference.short_title))}"} - = link_to 'Commercials', admin_conference_commercials_path(@conference.short_title) + = link_to 'Materials', admin_conference_commercials_path(@conference.short_title) - if can? :update, @conference %li{class: active_nav_li(edit_admin_conference_splashpage_path(@conference.short_title))} = link_to 'Splashpage', admin_conference_splashpage_path(@conference.short_title) diff --git a/app/views/proposals/_form.html.haml b/app/views/proposals/_form.html.haml index fe966ed1..7f6716d5 100644 --- a/app/views/proposals/_form.html.haml +++ b/app/views/proposals/_form.html.haml @@ -3,15 +3,15 @@ %li.active = link_to 'Proposal', '#proposal-content', 'data-toggle' => 'tab' %li - = link_to 'Commercials', '#commercials-content', 'data-toggle' => 'tab' + = link_to 'Materials', '#commercials-content', 'data-toggle' => 'tab' .tab-content #proposal-content.tab-pane.active = render 'proposals/proposal_form' #commercials-content.tab-pane %p.text-muted - You can add commercials for your proposal. These commercials will be displayed on the + You can add materals for your proposal. These materials will be displayed on the = link_to 'public proposal page.', conference_program_proposal_path(@conference.short_title, @event) - If you don't add a commercial, the conference commercial will be displayed! + If you don't add any materials, the conference materials will be displayed. - if can? :create, @event.commercials.new .row .col-md-6 From 3eeaebbdc84a94ed51507de7e673abbbd8606076 Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Mon, 27 Jan 2020 13:37:23 -0800 Subject: [PATCH 60/61] Rename more commericals to materials --- app/views/commercials/edit.html.haml | 2 +- app/views/commercials/new.html.haml | 2 +- spec/features/commercials_spec.rb | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/commercials/edit.html.haml b/app/views/commercials/edit.html.haml index 174a1a60..359f27a8 100644 --- a/app/views/commercials/edit.html.haml +++ b/app/views/commercials/edit.html.haml @@ -2,7 +2,7 @@ .row .col-md-12 .page-header - %h1 Editing Commercial + %h1 Edit Materials .row .col-md-12 = semantic_form_for @commercial, url: conference_program_proposal_commercial_path(conference_id: @conference.short_title, proposal_id: @event.id, id: @commercial.id) do |f| diff --git a/app/views/commercials/new.html.haml b/app/views/commercials/new.html.haml index da726e89..4152ff88 100644 --- a/app/views/commercials/new.html.haml +++ b/app/views/commercials/new.html.haml @@ -2,7 +2,7 @@ .row .col-md-12 .page-header - %h1 New Commercial + %h1 New Materials .row .col-md-12 = semantic_form_for @commercial, url: conference_program_proposal_commercials_path(conference_id: @conference.short_title, proposal_id: @event.id) do |f| diff --git a/spec/features/commercials_spec.rb b/spec/features/commercials_spec.rb index a0710f86..3dfaea1f 100644 --- a/spec/features/commercials_spec.rb +++ b/spec/features/commercials_spec.rb @@ -17,7 +17,7 @@ feature Commercial do # Create valid commercial fill_in 'commercial_url', with: 'https://www.youtube.com/watch?v=M9bq_alk-sw' - click_button 'Create Commercial' + click_button 'Save Materials' page.find('#flash') expect(flash).to eq('Commercial was successfully created.') page.find('#flash .button.close').click @@ -59,10 +59,10 @@ feature Commercial do click_link 'Commercials' fill_in 'commercial_url', with: 'https://www.youtube.com/watch?v=M9bq_alk-sw' - # Workaround to enable the 'Create Commercial' button + # Workaround to enable the 'Save Materials' button page.execute_script("$('#commercial_submit_action').prop('disabled', false)") - click_button 'Create Commercial' + click_button 'Save Materials' page.find('#flash') expect(flash).to eq('Commercial was successfully created.') end @@ -72,7 +72,7 @@ feature Commercial do click_link 'Commercials' fill_in 'commercial_url', with: 'invalid_commercial_url' expect(page).to have_content('No embeddable content') - expect(page).to have_css("button[type='submit']:disabled", text: 'Create Commercial') + expect(page).to have_css("button[type='submit']:disabled", text: 'Save Materials') end scenario 'updates a commercial of an event', feature: true, js: true do From 8a6bb879838d7e53859aeccc6db6638ab4e689cf Mon Sep 17 00:00:00 2001 From: Michael Ball Date: Mon, 27 Jan 2020 13:40:36 -0800 Subject: [PATCH 61/61] Replace more Commercials with Materials --- .../admin/commercials_controller.rb | 10 ++++---- .../admin/venue_commercials_controller.rb | 10 ++++---- app/controllers/commercials_controller.rb | 10 ++++---- app/models/commercial.rb | 2 +- app/views/admin/commercials/index.html.haml | 4 ++-- app/views/admin/events/show.html.haml | 4 ++-- app/views/admin/reports/_all_events.html.haml | 2 +- .../_events_without_commercials.html.haml | 2 +- app/views/admin/reports/index.html.haml | 2 +- app/views/admin/venues/_form.html.haml | 2 +- app/views/admin/venues/show.html.haml | 2 +- app/views/proposals/_tooltip.html.haml | 2 +- spec/features/commercials_spec.rb | 24 +++++++++---------- spec/features/info_desk_ability_spec.rb | 2 +- .../organization_admin_ability_spec.rb | 2 +- spec/features/organizer_ability_spec.rb | 2 +- spec/features/track_organizer_ability_spec.rb | 2 +- spec/features/versions_spec.rb | 16 ++++++------- 18 files changed, 50 insertions(+), 50 deletions(-) diff --git a/app/controllers/admin/commercials_controller.rb b/app/controllers/admin/commercials_controller.rb index 17d1dcf1..ee8cee00 100644 --- a/app/controllers/admin/commercials_controller.rb +++ b/app/controllers/admin/commercials_controller.rb @@ -17,10 +17,10 @@ module Admin if @commercial.save redirect_to admin_conference_commercials_path, - notice: 'Commercial was successfully created.' + notice: 'Materials were successfully created.' else redirect_to admin_conference_commercials_path, - error: 'An error prohibited this Commercial from being saved: '\ + error: 'An error prohibited materials from being saved: '\ "#{@commercial.errors.full_messages.join('. ')}." end @@ -29,17 +29,17 @@ module Admin def update if @commercial.update(commercial_params) redirect_to admin_conference_commercials_path, - notice: 'Commercial was successfully updated.' + notice: 'Materials were successfully updated.' else redirect_to admin_conference_commercials_path, - error: 'An error prohibited this Commercial from being saved: '\ + error: 'An error prohibited materials from being saved: '\ "#{@commercial.errors.full_messages.join('. ')}." end end def destroy @commercial.destroy - redirect_to admin_conference_commercials_path, notice: 'Materaisl were successfully removed.' + redirect_to admin_conference_commercials_path, notice: 'Materials were successfully removed.' end def render_commercial diff --git a/app/controllers/admin/venue_commercials_controller.rb b/app/controllers/admin/venue_commercials_controller.rb index ddd13aa9..10a46de6 100644 --- a/app/controllers/admin/venue_commercials_controller.rb +++ b/app/controllers/admin/venue_commercials_controller.rb @@ -12,10 +12,10 @@ module Admin if @commercial.save redirect_to admin_conference_venue_path, - notice: 'Commercial was successfully created.' + notice: 'Materials successfully created.' else redirect_to admin_conference_venue_path, - error: 'An error prohibited this Commercial from being saved: '\ + error: 'An error prohibited materials from being saved: '\ "#{@commercial.errors.full_messages.join('. ')}." end @@ -24,17 +24,17 @@ module Admin def update if @commercial.update(commercial_params) redirect_to admin_conference_venue_path, - notice: 'Commercial was successfully updated.' + notice: 'Materials successfully updated.' else redirect_to admin_conference_venue_path, - error: 'An error prohibited this Commercial from being saved: '\ + error: 'An error prohibited materials from being saved: '\ "#{@commercial.errors.full_messages.join('. ')}." end end def destroy @commercial.destroy - redirect_to admin_conference_venue_path, notice: 'Commercial was successfully destroyed.' + redirect_to admin_conference_venue_path, notice: 'Materials successfully destroyed.' end def render_commercial diff --git a/app/controllers/commercials_controller.rb b/app/controllers/commercials_controller.rb index aa48a406..9b5e2110 100644 --- a/app/controllers/commercials_controller.rb +++ b/app/controllers/commercials_controller.rb @@ -12,27 +12,27 @@ class CommercialsController < ApplicationController if @commercial.save redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'), - notice: 'Commercial was successfully created.' + notice: 'Materials were successfully created.' else redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'), - error: "An error prohibited this Commercial from being saved: #{@commercial.errors.full_messages.join('. ')}." + error: "An error prohibited these materials from being saved: #{@commercial.errors.full_messages.join('. ')}." end end def update if @commercial.update(commercial_params) redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'), - notice: 'Commercial was successfully updated.' + notice: 'Materials were successfully updated.' else redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'), - error: "An error prohibited this Commercial from being saved: #{@commercial.errors.full_messages.join('. ')}." + error: "An error prohibited materials from being saved: #{@commercial.errors.full_messages.join('. ')}." end end def destroy @commercial.destroy redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id), - notice: 'Commercial was successfully destroyed.' + notice: 'Materials were successfully destroyed.' end def render_commercial diff --git a/app/models/commercial.rb b/app/models/commercial.rb index 7bb2a081..4d28330c 100644 --- a/app/models/commercial.rb +++ b/app/models/commercial.rb @@ -39,7 +39,7 @@ class Commercial < ApplicationRecord commercial = event.commercials.new(url: url) unless commercial.save - errors[:validation_errors] << "Could not create commercial for event with ID #{event.id} (" + commercial.errors.full_messages.to_sentence + ')' + errors[:validation_errors] << "Could not create materials for event with ID #{event.id} (" + commercial.errors.full_messages.to_sentence + ')' end end errors diff --git a/app/views/admin/commercials/index.html.haml b/app/views/admin/commercials/index.html.haml index 8c367ab9..2dbe10a2 100644 --- a/app/views/admin/commercials/index.html.haml +++ b/app/views/admin/commercials/index.html.haml @@ -3,9 +3,9 @@ .page-header %h1 Session Materials %p.text-muted - Conference commercials will be displayed on the events in the + Conference materials will be displayed on the events in the = link_to 'schedule,', conference_schedule_path(@conference.short_title) - if the event speaker didn't add an event commercial. + if the event speaker didn't add any event materials. - if can? :create, @conference.commercials.new .row .col-md-6 diff --git a/app/views/admin/events/show.html.haml b/app/views/admin/events/show.html.haml index ff341db4..525e4c93 100644 --- a/app/views/admin/events/show.html.haml +++ b/app/views/admin/events/show.html.haml @@ -42,7 +42,7 @@ - else = general_change_description(version) - = link_to 'commercial', + = link_to 'materials', edit_admin_conference_program_event_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content') @@ -82,7 +82,7 @@ %td{ 'class' => class_for_todo(progress_status['subtitle']) } %span{ 'class' => [icon_for_todo(progress_status['subtitle']), 'fa-lg'] } %tr - %td= link_to 'Add a commercial', edit_admin_conference_program_event_path(@event.program.conference.short_title, @event, anchor: 'commercials-content') + %td= link_to 'Add materials', edit_admin_conference_program_event_path(@event.program.conference.short_title, @event, anchor: 'commercials-content') %td{ 'class' => class_for_todo(progress_status['commercials']) } %span{ 'class' => [icon_for_todo(progress_status['commercials']), 'fa-lg'] } - unless progress_status['track'].nil? diff --git a/app/views/admin/reports/_all_events.html.haml b/app/views/admin/reports/_all_events.html.haml index 712d4ad7..0eb6b829 100644 --- a/app/views/admin/reports/_all_events.html.haml +++ b/app/views/admin/reports/_all_events.html.haml @@ -14,7 +14,7 @@ %th Title %th Speakers Registered %th Speakers Biographies - %th Commercial + %th Materials %th Subtitle %th Difficulty Level - if @program.tracks.any? diff --git a/app/views/admin/reports/_events_without_commercials.html.haml b/app/views/admin/reports/_events_without_commercials.html.haml index 025c0117..77020191 100644 --- a/app/views/admin/reports/_events_without_commercials.html.haml +++ b/app/views/admin/reports/_events_without_commercials.html.haml @@ -5,7 +5,7 @@ Events Without Materials = "(#{@events_missing_commercial.length})" %p.text-muted - All submissions that have no commercial + All submissions that have no materials .col-md-12 %table.datatable %thead diff --git a/app/views/admin/reports/index.html.haml b/app/views/admin/reports/index.html.haml index 6bbb8886..db6480f3 100644 --- a/app/views/admin/reports/index.html.haml +++ b/app/views/admin/reports/index.html.haml @@ -4,7 +4,7 @@ = link_to 'All Events', '#all', 'data-toggle' => 'tab' %li %a{href: '#missing-commercial', 'data-toggle' => 'tab'} - Events without Commercials + Events without Materials %span.label.label-danger{style: 'border-radius: 1em;'} = @events_missing_commercial.length %li diff --git a/app/views/admin/venues/_form.html.haml b/app/views/admin/venues/_form.html.haml index 6f64de48..e19325da 100644 --- a/app/views/admin/venues/_form.html.haml +++ b/app/views/admin/venues/_form.html.haml @@ -56,4 +56,4 @@ %hr - else - First Create Venue, then update commercial + First Create Venue, then update materials diff --git a/app/views/admin/venues/show.html.haml b/app/views/admin/venues/show.html.haml index 36906e05..de29c4e3 100644 --- a/app/views/admin/venues/show.html.haml +++ b/app/views/admin/venues/show.html.haml @@ -12,7 +12,7 @@ -else - if @venue.commercial.nil? .row - %img{ "data-src" => "holder.js/500x300?text=No Commercial Set", class: 'img-responsive img-rounded' } + %img{ "data-src" => "holder.js/500x300?text=No Materials Set", class: 'img-responsive img-rounded' } - else - if @venue.commercial.persisted? .thumbnail diff --git a/app/views/proposals/_tooltip.html.haml b/app/views/proposals/_tooltip.html.haml index b10b5a7a..2220451d 100644 --- a/app/views/proposals/_tooltip.html.haml +++ b/app/views/proposals/_tooltip.html.haml @@ -20,7 +20,7 @@ = link_to 'Add a subtitle', edit_conference_program_proposal_path(event.program.conference.short_title, event) %li{'class'=>class_for_todo(progress_status['commercials'])} %span{'class'=>icon_for_todo(progress_status['commercials'])} - = link_to 'Add a commercial', edit_conference_program_proposal_path(event.program.conference.short_title, event, anchor: 'commercials-content') + = link_to 'Add materials', edit_conference_program_proposal_path(event.program.conference.short_title, event, anchor: 'commercials-content') - unless progress_status['track'].nil? %li{'class'=>class_for_todo(progress_status['track'])} %span{'class'=>icon_for_todo(progress_status['track'])} diff --git a/spec/features/commercials_spec.rb b/spec/features/commercials_spec.rb index 3dfaea1f..5ddb08b2 100644 --- a/spec/features/commercials_spec.rb +++ b/spec/features/commercials_spec.rb @@ -19,7 +19,7 @@ feature Commercial do fill_in 'commercial_url', with: 'https://www.youtube.com/watch?v=M9bq_alk-sw' click_button 'Save Materials' page.find('#flash') - expect(flash).to eq('Commercial was successfully created.') + expect(flash).to eq('Materials were successfully created.') page.find('#flash .button.close').click expect(conference.commercials.count).to eq(1) @@ -28,7 +28,7 @@ feature Commercial do fill_in "commercial_url_#{commercial.id}", with: 'https://www.youtube.com/watch?v=VNkDJk5_9eU' click_button 'Update' page.find('#flash') - expect(flash).to eq('Commercial was successfully updated.') + expect(flash).to eq('Materials were successfully updated.') page.find('#flash .button.close').click expect(conference.commercials.count).to eq(1) commercial.reload @@ -39,7 +39,7 @@ feature Commercial do click_link 'Delete' end page.find('#flash') - expect(flash).to eq('Commercial was successfully destroyed.') + expect(flash).to eq('Materials were successfully destroyed.') expect(conference.commercials.count).to eq(0) end end @@ -56,7 +56,7 @@ feature Commercial do scenario 'adds a valid commercial of an event', feature: true, js: true do visit edit_conference_program_proposal_path(conference.short_title, event.id) - click_link 'Commercials' + click_link 'Materials' fill_in 'commercial_url', with: 'https://www.youtube.com/watch?v=M9bq_alk-sw' # Workaround to enable the 'Save Materials' button @@ -64,12 +64,12 @@ feature Commercial do click_button 'Save Materials' page.find('#flash') - expect(flash).to eq('Commercial was successfully created.') + expect(flash).to eq('Materials were successfully created.') end scenario 'does not add an invalid commercial of an event', feature: true, js: true do visit edit_conference_program_proposal_path(conference.short_title, event.id) - click_link 'Commercials' + click_link 'Materials' fill_in 'commercial_url', with: 'invalid_commercial_url' expect(page).to have_content('No embeddable content') expect(page).to have_css("button[type='submit']:disabled", text: 'Save Materials') @@ -80,11 +80,11 @@ feature Commercial do commercialable_id: event.id, commercialable_type: 'Event') visit edit_conference_program_proposal_path(conference.short_title, event.id) - click_link 'Commercials' + click_link 'Materials' fill_in "commercial_url_#{commercial.id}", with: 'https://www.youtube.com/watch?v=M9bq_alk-sw' click_button 'Update' page.find('#flash') - expect(flash).to eq('Commercial was successfully updated.') + expect(flash).to eq('Materials were successfully updated.') TransactionalCapybara::AjaxHelpers.wait_for_ajax(page) expect(event.commercials.count).to eq(1) commercial.reload @@ -97,12 +97,12 @@ feature Commercial do commercialable_type: 'Event', url: 'https://www.youtube.com/watch?v=BTTygyxuGj8') visit edit_conference_program_proposal_path(conference.short_title, event.id) - click_link 'Commercials' + click_link 'Materials' fill_in "commercial_url_#{commercial.id}", with: 'invalid_commercial_url' click_button 'Update' find('#flash') expect(current_path).to eq edit_conference_program_proposal_path(conference.short_title, event.id) - expect(flash).to include('An error prohibited this Commercial from being saved:') + expect(flash).to include('An error prohibited materials from being saved:') commercial.reload expect(commercial.url).to eq('https://www.youtube.com/watch?v=BTTygyxuGj8') end @@ -112,12 +112,12 @@ feature Commercial do commercialable_id: event.id, commercialable_type: 'Event') visit edit_conference_program_proposal_path(conference.short_title, event.id) - click_link 'Commercials' + click_link 'Materials' page.accept_alert do click_link 'Delete' end page.find('#flash') - expect(flash).to eq('Commercial was successfully destroyed.') + expect(flash).to eq('Materials were successfully destroyed.') TransactionalCapybara::AjaxHelpers.wait_for_ajax(page) expect(event.commercials.count).to eq(0) end diff --git a/spec/features/info_desk_ability_spec.rb b/spec/features/info_desk_ability_spec.rb index 066c95b8..95367ebb 100644 --- a/spec/features/info_desk_ability_spec.rb +++ b/spec/features/info_desk_ability_spec.rb @@ -21,7 +21,7 @@ feature 'Has correct abilities' do expect(page).to_not have_link('Basics', href: "/admin/conferences/#{conference.short_title}/edit") expect(page).to have_text('Basics') expect(page).to_not have_link('Contact', href: "/admin/conferences/#{conference.short_title}/contact/edit") - expect(page).to have_link('Commercials', href: "/admin/conferences/#{conference.short_title}/commercials") + expect(page).to have_link('Materials', href: "/admin/conferences/#{conference.short_title}/commercials") expect(page).to_not have_link('Splashpage', href: "/admin/conferences/#{conference.short_title}/splashpage") expect(page).to_not have_link('Lodgings', href: "/admin/conferences/#{conference.short_title}/lodgings") expect(page).to_not have_link('Registration Period', href: "/admin/conferences/#{conference.short_title}/registration_period") diff --git a/spec/features/organization_admin_ability_spec.rb b/spec/features/organization_admin_ability_spec.rb index 5765d97f..3f9e32f8 100644 --- a/spec/features/organization_admin_ability_spec.rb +++ b/spec/features/organization_admin_ability_spec.rb @@ -32,7 +32,7 @@ feature 'Has correct abilities' do expect(page).to have_selector('li.nav-header.nav-header-bigger a', text: 'Dashboard') expect(page).to have_link('Basics', href: "/admin/conferences/#{conference.short_title}/edit") expect(page).to have_link('Contact', href: "/admin/conferences/#{conference.short_title}/contact/edit") - expect(page).to have_link('Commercials', href: "/admin/conferences/#{conference.short_title}/commercials") + expect(page).to have_link('Materials', href: "/admin/conferences/#{conference.short_title}/commercials") expect(page).to have_link('Splashpage', href: "/admin/conferences/#{conference.short_title}/splashpage") expect(page).to have_link('Venue', href: "/admin/conferences/#{conference.short_title}/venue") expect(page).to have_link('Rooms', href: "/admin/conferences/#{conference.short_title}/venue/rooms") diff --git a/spec/features/organizer_ability_spec.rb b/spec/features/organizer_ability_spec.rb index 6339b6fa..27935824 100644 --- a/spec/features/organizer_ability_spec.rb +++ b/spec/features/organizer_ability_spec.rb @@ -35,7 +35,7 @@ feature 'Has correct abilities' do expect(page).to have_selector('li.nav-header.nav-header-bigger a', text: 'Dashboard') expect(page).to have_link('Basics', href: "/admin/conferences/#{conference.short_title}/edit") expect(page).to have_link('Contact', href: "/admin/conferences/#{conference.short_title}/contact/edit") - expect(page).to have_link('Commercials', href: "/admin/conferences/#{conference.short_title}/commercials") + expect(page).to have_link('Materials', href: "/admin/conferences/#{conference.short_title}/commercials") expect(page).to have_link('Splashpage', href: "/admin/conferences/#{conference.short_title}/splashpage") expect(page).to have_link('Venue', href: "/admin/conferences/#{conference.short_title}/venue") expect(page).to have_link('Rooms', href: "/admin/conferences/#{conference.short_title}/venue/rooms") diff --git a/spec/features/track_organizer_ability_spec.rb b/spec/features/track_organizer_ability_spec.rb index ec2ffdf1..1107f777 100644 --- a/spec/features/track_organizer_ability_spec.rb +++ b/spec/features/track_organizer_ability_spec.rb @@ -23,7 +23,7 @@ feature 'Has correct abilities' do expect(page).to_not have_link('Basics', href: "/admin/conferences/#{conference.short_title}/edit") expect(page).to have_text('Basics') expect(page).to_not have_link('Contact', href: "/admin/conferences/#{conference.short_title}/contact/edit") - expect(page).to have_link('Commercials', href: "/admin/conferences/#{conference.short_title}/commercials") + expect(page).to have_link('Materials', href: "/admin/conferences/#{conference.short_title}/commercials") expect(page).to_not have_link('Splashpage', href: "/admin/conferences/#{conference.short_title}/splashpage") expect(page).to_not have_link('Venue', href: "/admin/conferences/#{conference.short_title}/venue") expect(page).to_not have_link('Rooms', href: "/admin/conferences/#{conference.short_title}/venue/rooms") diff --git a/spec/features/versions_spec.rb b/spec/features/versions_spec.rb index ec443fd0..cf0c49ed 100644 --- a/spec/features/versions_spec.rb +++ b/spec/features/versions_spec.rb @@ -277,9 +277,9 @@ feature 'Version' do conference_commercial.destroy visit admin_revision_history_path - expect(page).to have_text("Someone (probably via the console) created new commercial in conference #{conference.short_title}") - expect(page).to have_text("Someone (probably via the console) updated url of commercial in conference #{conference.short_title}") - expect(page).to have_text("Someone (probably via the console) deleted commercial in conference #{conference.short_title}") + expect(page).to have_text("Someone (probably via the console) created new materials in conference #{conference.short_title}") + expect(page).to have_text("Someone (probably via the console) updated url of materials in conference #{conference.short_title}") + expect(page).to have_text("Someone (probably via the console) deleted materials in conference #{conference.short_title}") end scenario 'display changes in event commercials', feature: true, versioning: true, js: true do @@ -288,9 +288,9 @@ feature 'Version' do event_commercial.destroy visit admin_revision_history_path - expect(page).to have_text("Someone (probably via the console) created new commercial in event #{event_with_commercial.title} in conference #{conference.short_title}") - expect(page).to have_text("Someone (probably via the console) updated url of commercial in event #{event_with_commercial.title} in conference #{conference.short_title}") - expect(page).to have_text("Someone (probably via the console) deleted commercial in event #{event_with_commercial.title} in conference #{conference.short_title}") + expect(page).to have_text("Someone (probably via the console) created new materals in event #{event_with_commercial.title} in conference #{conference.short_title}") + expect(page).to have_text("Someone (probably via the console) updated url of materials in event #{event_with_commercial.title} in conference #{conference.short_title}") + expect(page).to have_text("Someone (probably via the console) deleted materials in event #{event_with_commercial.title} in conference #{conference.short_title}") end scenario 'display changes in event commercials in event history', feature: true, versioning: true, js: true do @@ -299,10 +299,10 @@ feature 'Version' do visit admin_conference_program_event_path(conference.short_title, event_with_commercial) click_link 'History' - expect(page).to have_text('Someone (probably via the console) created new commercial') + expect(page).to have_text('Someone (probably via the console) created new materials') visit admin_conference_program_event_path(conference.short_title, event_without_commercial) click_link 'History' - expect(page).to have_no_text('Someone (probably via the console) created new commercial') + expect(page).to have_no_text('Someone (probably via the console) created new materials') end scenario 'display changes in organization', feature: true, versioning: true, js: true do