This commit is contained in:
James Mason 2017-11-29 01:31:44 +00:00 • committed by GitHub
commit 3024bddb82
48 changed files with 686 additions and 562 deletions

View file

@ -121,20 +121,9 @@ linters:
- "app/views/conference_registrations/_registration_info.html.haml"
- "app/views/conference_registrations/_volunteer.html.haml"
- "app/views/conference_registrations/show.html.haml"
- "app/views/conferences/_booths.html.haml"
- "app/views/conferences/_call_for_paper.html.haml"
- "app/views/conferences/_conference_details.html.haml"
- "app/views/conferences/_gallery.html.haml"
- "app/views/conferences/_lodging.html.haml"
- "app/views/conferences/_program.html.haml"
- "app/views/conferences/_registration.html.haml"
- "app/views/conferences/_schedule_splashpage.html.haml"
- "app/views/conferences/_sponsors.html.haml"
- "app/views/conferences/_tickets.html.haml"
- "app/views/conferences/_venue.html.haml"
- "app/views/conferences/_venue_map.html.haml"
- "app/views/conferences/index.html.haml"
- "app/views/conferences/show.html.haml"
- "app/views/devise/confirmations/new.html.haml"
- "app/views/devise/ichain_sessions/new.html.haml"
- "app/views/devise/ichain_sessions/new_test.html.haml"

View file

@ -212,6 +212,9 @@ gem 'selectize-rails'
# CVE-2017-9049, CVE-2017-9050
gem 'nokogiri', '>= 1.8.1'
# memcached binary connector
gem 'dalli'
# Use guard and spring for testing in development
group :development do
# to launch specs when files are modified

View file

@ -142,6 +142,7 @@ GEM
safe_yaml (~> 1.0.0)
currencies (0.4.2)
daemons (1.1.9)
dalli (2.7.6)
dante (0.2.0)
database_cleaner (1.3.0)
debug_inspector (0.0.2)
@ -288,7 +289,7 @@ GEM
multi_json (1.12.1)
multi_xml (0.5.5)
multipart-post (2.0.0)
mysql2 (0.4.9)
mysql2 (0.4.10)
nenv (0.3.0)
netrc (0.11.0)
nokogiri (1.8.1)
@ -585,6 +586,7 @@ DEPENDENCIES
country_select
coveralls
daemons
dalli
database_cleaner
delayed_job_active_record
devise

View file

@ -2,20 +2,20 @@
@if $class == xs {
@media (max-width: 767px) { @content; }
}
@else if $class == sm {
@media (min-width: 750px) { @content; }
@media (min-width: 768px) and (max-width: 991px) { @content; }
}
@else if $class == md {
@media (min-width: 992px) { @content; }
@media (min-width: 992px) and (max-width: 1199px) { @content; }
}
@else if $class == lg {
@media (min-width: 1200px) { @content; }
}
@else {
@warn "Breakpoint mixin supports: xs, sm, md, lg";
}
}
}

View file

@ -9,19 +9,44 @@ class ConferencesController < ApplicationController
end
def show
@conference = if params[:id]
Conference.find_by_short_title(params[:id])
else
load_conference_by_domain
end
@conference = Conference.unscoped.eager_load(
:organization,
:splashpage,
:venue,
:registration_period,
:tickets,
:confirmed_tracks,
:call_for_events,
:event_types,
:program,
:call_for_tracks,
:lodgings,
:call_for_booths,
:confirmed_booths,
:sponsors,
:call_for_sponsors,
:contact,
highlighted_events: [:speakers],
sponsorship_levels: [:sponsors]
).order(
'sponsorship_levels.position ASC',
'sponsors.name',
'tracks.name',
'booths.title',
'lodgings.name',
'tickets.price_cents'
).find_by(conference_finder_conditions)
authorize! :show, @conference
@program = @conference.program
end
private
def load_conference_by_domain
Conference.find_by(custom_domain: request.domain)
def conference_finder_conditions
if params[:id]
{ short_title: params[:id] }
else
{ custom_domain: request.domain }
end
end
def respond_to_options

View file

@ -56,17 +56,7 @@ module ApplicationHelper
end
def tracks(conference)
all = conference.program.tracks.confirmed.cfp_active.pluck(:name)
first = all[0...-1]
last = all[-1]
ts = ''
if all.length > 1
ts << first.join(', ')
ts << " and #{last}"
else
ts = all.join
end
return ts
conference.confirmed_tracks.collect(&:name).to_sentence
end
def difficulty_levels(conference)
@ -152,7 +142,7 @@ module ApplicationHelper
end
def event_types(conference)
conference.program.event_types.map { |et| et.title.pluralize }.to_sentence
conference.event_types.map { |et| et.title.pluralize }.to_sentence
end
def sign_in_path
@ -191,4 +181,19 @@ module ApplicationHelper
title: 'Open Source Event Manager'
)
end
# returns the url to be used for logo on basis of sponsorship level position
def get_logo(object)
if object.try(:sponsorship_level)
if object.sponsorship_level.position == 1
object.picture.first.url
elsif object.sponsorship_level.position == 2
object.picture.second.url
else
object.picture.others.url
end
else
object.picture.large.url
end
end
end

View file

@ -0,0 +1,18 @@
module ConferenceHelper
# Return true if only call_for_papers or call_for_tracks is open
def one_call_open(conference)
conference.call_for_events.try(:open?) ^
conference.call_for_tracks.try(:open?)
end
# URL for sponsorship emails
def sponsorship_mailto(conference)
[
'mailto:',
conference.contact.sponsor_email,
'?subject=',
url_encode(conference.short_title),
'%20Sponsorship'
].join
end
end

View file

@ -1,12 +0,0 @@
module SponsorsHelper
# returns the url to be used for logo on basis of sponsorship level position
def get_logo(sponsor)
if sponsor.sponsorship_level.position == 1
sponsor.picture.first.url
elsif sponsor.sponsorship_level.position == 2
sponsor.picture.second.url
else
sponsor.picture.others.url
end
end
end

View file

@ -33,6 +33,7 @@ class Conference < ActiveRecord::Base
end
has_many :resources, dependent: :destroy
has_many :booths, dependent: :destroy
has_many :confirmed_booths, -> { where(state: 'confirmed') }, class_name: 'Booth'
has_many :lodgings, dependent: :destroy
has_many :registrations, dependent: :destroy
@ -45,7 +46,16 @@ class Conference < ActiveRecord::Base
has_many :campaigns, dependent: :destroy
has_many :commercials, as: :commercialable, dependent: :destroy
has_many :subscriptions, dependent: :destroy
has_one :call_for_sponsors, -> { where(cfp_type: 'sponsors') }, through: :program, source: :cfps
has_one :call_for_events, -> { where(cfp_type: 'events') }, through: :program, source: :cfps
has_one :call_for_booths, -> { where(cfp_type: 'booths') }, through: :program, source: :cfps
has_one :call_for_tracks, -> { where(cfp_type: 'tracks') }, through: :program, source: :cfps
has_many :confirmed_tracks, -> { where(state: 'confirmed') }, through: :program, source: :tracks
has_many :highlighted_events,
-> { where(state: :confirmed, is_highlight: true) },
through: :program,
source: :events
has_many :event_types, through: :program
accepts_nested_attributes_for :venue
accepts_nested_attributes_for :tickets, allow_destroy: true
accepts_nested_attributes_for :sponsorship_levels, allow_destroy: true

View file

@ -8,7 +8,7 @@
= f.inputs name: 'Components' do
= f.input :include_tracks, label: 'Display tracks', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_tracks) }
= f.input :include_program, label: 'Display program', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_program) }
= f.input :include_cfp, label: 'Display call for papers information on splashpage, while cfp is open', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_cfp) }
= f.input :include_cfp, label: 'Display call for papers and call for tracks information on splashpage, while open', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_cfp) }
= f.input :include_venue, label: 'Display venue', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_venue) }
= f.input :include_registrations, label: 'Display the registration period', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_registrations) }
= f.input :include_tickets, label: 'Display tickets', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_tickets) }

View file

@ -25,7 +25,7 @@
- else
No
%dt
Include CFP:
Include Calls for Content:
%dd
- if @splashpage.include_cfp
Yes

View file

@ -0,0 +1,19 @@
- cache [conference.confirmed_booths, '#splash#booths'] do
%section#booths
.container
.row
.col-md-12.text-center
%h2 Booths
.row.row-centered
- conference.confirmed_booths.each do |booth|
.col-md-2.col-sm-2.col-centered.col-top
%a.thumbnail{ href: '#',
data: { toggle: 'modal', target: "#modal-booth-#{booth.id}" } }
- if booth.picture?
= image_tag get_logo(booth),
class: ['img-responsive', 'img-rounded'],
title: booth.title
- else
.caption
%h3.text-center= booth.title
= render 'modal_description', object: booth

View file

@ -1,24 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#booths' } Booths
.container
.row
.col-md-12.text-center
%h2 Booths
- @conference.booths.confirmed.each_slice(3).with_index do |slice, index_for_row|
.row.row-centered
- slice.each.with_index do |booth, index_for_column|
.col-md-4.col-sm-4.col-xs-10.col-centered.col-top
.thumbnail
- if booth.logo_link
= link_to booth.website_url, class: 'thumbnail' do
= image_tag booth.picture.large.url
.caption
%h3.text-center
= booth.title
%p.text-center.text-muted
= link_to "#show_descrition_#{index_for_row}_#{index_for_column}", "data-toggle"=>"collapse" do
learn more
.collapse{ id: "show_descrition_#{index_for_row}_#{index_for_column}" }
= markdown(booth.description)

View file

@ -0,0 +1,14 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#call' } Call For Content
%section#call
.container
.row
- if one_call_open(conference)
.col-md-3.col-sm-3.hidden-xs &nbsp;
- if conference.call_for_events.try(:open?)
= render 'call_for_papers', conference: conference
.col-md-2.col-sm-2 &nbsp;
- if conference.call_for_tracks.try(:open?)
= render 'call_for_tracks', conference: conference

View file

@ -1,43 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#callforpapers' } Call For Papers
.container
.row
.col-md-12.text-center
%h2
Call for Papers
%p.lead
We are ready to accept your proposals for sessions!
.row
.col-md-6.col-md-offset-3.col-sm-10.col-sm-offset-1
%p
- if @conference.program.event_types.any?
You can submit proposals for
%span.notranslate
= "#{event_types(@conference)}."
- if @conference.program.tracks.any?
Proposals should fit in one of the
%span.notranslate
= "#{pluralize(@conference.program.tracks.count, 'track')}:"
= "#{tracks(@conference)}."
The submission period has begun
%em.notranslate
= @conference.program.cfp.start_date.strftime('%A, %B %-d. %Y')
and closes
%em.notranslate
= @conference.program.cfp.end_date.strftime('%A, %B %-d. %Y.')
- if @conference.program.cfp_open?
That means you have only
%b.notranslate= pluralize(@conference.program.cfp.remaining_days, 'day')
left!
Remember
%span.notranslate
= @conference.short_title
will only be as good as the sessions you present. Submit early, submit often!
- else
The submission period is closed.
.row
.col-md-12.text-center
%p.cta-button
= link_to "Submit your paper now", conference_program_proposals_path(@conference.short_title), class: 'btn btn-success btn-lg text-center'

View file

@ -0,0 +1,30 @@
- cache [conference, conference.call_for_events, conference.confirmed_tracks,
'#splash#callforpapers'] do
.col-md-5.col-sm-5.text-center
%h2
Call for Papers
%p.lead
We are now accepting proposals for sessions!
%p
- if conference.event_types.any?
You can submit proposals for
%span.notranslate
= event_types(conference) + '.'
- if conference.confirmed_tracks.any?
Proposals should fit in one of the
%span.notranslate
= pluralize(conference.confirmed_tracks.length, 'track') + ':'
= tracks(conference)} + '.'
- if conference.call_for_events.try(:open?)
The submission period is open
%em.notranslate
= date_string(conference.call_for_events.start_date,
conference.call_for_events.end_date) + '.'
%b
You have
= pluralize(conference.call_for_events.remaining_days, 'day')
left!
%p.cta-button
= link_to "Submit your proposal now",
conference_program_proposals_path(conference.short_title),
class: 'btn btn-success btn-lg text-center'

View file

@ -0,0 +1,20 @@
- cache [conference, conference.call_for_tracks, '#splash#callfortracks'] do
.col-md-5.col-sm-5.text-center
%h2
Call for Tracks
%p.lead
We are now accepting custom track requests!
%p
Would you like to host a mini-summit, sub-conference, or hack space?
The submission period for track requests is open
%em
= date_string(conference.call_for_tracks.start_date,
conference.call_for_tracks.end_date) + '.'
%b
You have
= pluralize(conference.call_for_tracks.remaining_days, 'day')
left!
%p.cta-button
= link_to("Submit your request for track",
conference_program_tracks_path(conference.short_title),
class: 'btn btn-success btn-lg text-center')

View file

@ -1,30 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#callfortracks' } Call For Tracks
.container
.row
.col-md-12.text-center
%h2
Call for Tracks
%p.lead
We are ready to accept requests for tracks!
.row
.col-md-6.col-md-offset-3.col-sm-10.col-sm-offset-1
%p
The submission period for track requests has begun
%em.notranslate
= @conference.program.cfps.for_tracks.start_date.strftime('%A, %B %-d. %Y')
and closes
%em.notranslate
= @conference.program.cfps.for_tracks.end_date.strftime('%A, %B %-d. %Y.')
- if @conference.program.cfps.for_tracks.try(:open?)
That means you have only
%b.notranslate= pluralize(@conference.program.cfps.for_tracks.remaining_days, 'day')
left!
- else
The submission period for track requests is closed.
.row
.col-md-12.text-center
%p.cta-button
= link_to "Submit your request for track", conference_program_tracks_path(@conference.short_title), class: 'btn btn-success btn-lg text-center'

View file

@ -0,0 +1,37 @@
- cache [conference, conference.venue, '#splash#header'] do
#banner
.container
.row
.col-md-8.col-md-offset-2#header
.row
.col-md-4
- if conference.picture?
= image_tag(conference.picture_url,
class: 'img-responsive img-center',
id: 'splash-logo')
.col-md-8
%h1
= conference.title
%h3
- if conference.start_date && conference.end_date
%span.date.text-nowrap
= date_string(conference.start_date, conference.end_date)
&bull;
- if conference.venue
%span.venue.text-nowrap
- if conference.venue.website
= sanitize link_to(conference.venue.name,
conference.venue.website)
- else
= conference.venue.city
- if conference.venue.country_name != 'US'
&bull;
= conference.venue.country_name
- unless conference.description.blank?
%section#about
.container
.row
.col-md-8.col-md-offset-2
%h3.text-center
= markdown(conference.description)

View file

@ -0,0 +1,19 @@
.row
.col-md-12
%h3.text-center
Program Highlights
.row
.col-md-12
.row.row-centered
- conference.highlighted_events.each do |event|
- speaker = event.speakers_ordered.first
.col-md-3.col-sm-3.col-centered.col-top.highlights
= link_to(conference_program_proposal_path(conference.short_title,
event),
class: 'thumbnail') do
= image_tag speaker.gravatar_url(size: 300),
class: ['img-responsive', 'img-circle'],
title: speaker.name
.caption
%h3.text-center= speaker.name
%h4.text-center= event.title

View file

@ -0,0 +1,41 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#lodging' } Lodging
- cache [conference.venue, conference.lodgings, '#splash#lodging'] do
%section#lodging
.container
.row
.col-md-12.text-center
%h2
Where to stay
- if conference.venue
in
= conference.venue.city
%p.lead
We recommend the following accommodations for your visit.
.row.row-centered
- conference.lodgings.each do |lodging|
.col-md-4.col-sm-4.col-centered.col-top
.thumbnail
- if lodging.picture?
- if lodging.website_link.present?
= link_to(lodging.website_link, class: 'thumbnail') do
= image_tag lodging.picture.large.url,
class: 'img-responsive img-lodging'
- else
= image_tag lodging.picture.large.url,
class: 'img-responsive img-lodging'
- else
%p.text-center
- if lodging.website_link.present?
= link_to(lodging.website_link, class: 'thumbnail') do
%i.fa.fa-home.fa-5x
- else
%i.fa.fa-home.fa-5x
.caption
%h3.text-center
= lodging.name
- if lodging.description.present?
= markdown(lodging.description)

View file

@ -1,37 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#lodging' } Lodging
.container
.row
.col-md-12.text-center
%h2
Where to stay
- if @conference.venue
in
= @conference.venue.city
%p.lead
We recommend these affordable lodging accommodations for your visit.
.row.row-centered{ style:"display: flex; flex-wrap: wrap" }
- @conference.lodgings.each do |lodging|
.col-md-4.col-sm-4.col-centered.col-top{ style:"display:flex;" }
.thumbnail
- if lodging.picture?
-if lodging.website_link.present?
= link_to(lodging.website_link, class: 'thumbnail') do
= image_tag lodging.picture.large.url, class: 'img-responsive img-lodging'
- else
= image_tag lodging.picture.large.url, class: 'img-responsive img-lodging'
- else
%p.text-center
-if lodging.website_link.present?
= link_to(lodging.website_link, class: 'thumbnail') do
%i.fa.fa-home.fa-5x
- else
%i.fa.fa-home.fa-5x
.caption
%h3.text-center
= lodging.name
-if lodging.description.present?
= markdown(lodging.description)

View file

@ -0,0 +1,21 @@
- content_for :modals do
.modal.fade{ id: "modal-#{object.class.name.downcase}-#{object.id}" }
.modal-dialog
.modal-content
.modal-header
%button.close{ data: { dismiss: 'modal' } }
%i.fa.fa-close
%h3.modal-title
= object.try(:title) || object.try(:name)
.modal-body
%p.logo
= link_to object.website_url || '#', target: '_blank' do
- img_classes = ['img-responsive center-block']
- if object.is_a? Sponsor
- img_classes << ['img-sponsor',
"img-sponsor-#{object.sponsorship_level.position}"]
= image_tag get_logo(object), class: img_classes
%p.description
= object.description
.modal-footer
= link_to nil, object.website_url, target: '_blank'

View file

@ -0,0 +1,31 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#schedule' } Schedule
- cache [@confererence, conference.confirmed_tracks, '#splash#schedule'] do
%section#schedule
.container
.row
.col-md-12
%p.lead.text-center
%span.notranslate
= conference.title
has the most awesome program ever!
- if conference.highlighted_events.any?
= render 'highlights', conference: conference
- if conference.splashpage.include_tracks
- if conference.confirmed_tracks.any?
= render 'tracks', conference: conference
- if conference.program.try(:schedule_public?)
.row
.col-md-12
%p.cta-button.text-center
= link_to(conference_schedule_path(conference.short_title),
class: 'btn btn-success btn-lg') do
Full Schedule
- if conference.splashpage.include_booths && conference.confirmed_booths.any?
= render 'booths', conference: conference

View file

@ -1,40 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#callforpapers' } Call For Papers
.container
.row
.col-md-12.text-center
%h2
Call for Papers
%p.lead
We are ready to accept your proposals for sessions!
.row
.col-md-6.col-md-offset-3.col-sm-10.col-sm-offset-1
%p
- if @conference.program.event_types.any?
You can submit proposals for
= "#{event_types(@conference)}."
- if @conference.tracks.any?
Proposals should fit in one of the
= "#{pluralize(@conference.tracks.count, 'track')}:"
= "#{tracks(@conference)}."
The submission period has begun
%em
= @program.cfp.start_date.strftime('%A, %B %-d. %Y')
and closes
%em
= @program.cfp.end_date.strftime('%A, %B %-d. %Y.')
- if @conference.cfp_open?
That means you have only
%b= pluralize(@program.cfp.remaining_days, 'day')
left!
Remember
= @conference.short_title
will only be as good as the sessions you present. Submit early, submit often!
- else
The submission period is closed.
.row
.col-md-12.text-center
%p.cta-button
= link_to "Submit your paper now", conference_proposals_path(@conference.short_title), class: 'btn btn-success btn-lg text-center'

View file

@ -0,0 +1,32 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#registration' } Registration
- cache [conference.registration_period, conference.tickets,
'#splash#registration'] do
%section#registration
.container
.row
.col-md-12.text-center
%h1 Registration
- if conference.registration_limit_exceeded?
%p
Sorry, the conference registration limit has exceeded
- elsif conference.tickets.empty?
%p.lead
Going to
= conference.short_title
is free of charge.
%p
We only ask you to register yourself before
= date_string(conference.registration_period.end_date)
so we can plan for the right amount of people.
%p.cta-button
- else
%p
The registration period ends on
= date_string(conference.registration_period.end_date)
%p.cta-button
= link_to('Register Now',
new_conference_conference_registration_path(conference.short_title),
class: 'btn btn-lg btn-success') do

View file

@ -1,30 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#registration' } Registration
.container
.row
.col-md-12.text-center
%h1 Registration
- if @conference.registration_limit_exceeded?
%p
Sorry, the conference registration limit has exceeded
- else
- if @conference.tickets.empty?
%p.lead
Going to
= @conference.short_title
is free of charge.
%p
We only ask you to register yourself until
= @conference.registration_period.end_date.strftime('%A, %B %-d. %Y')
so we can plan for the right amount of people.
%p.cta-button
- else
%p
The registration period ends on
= @conference.registration_period.end_date.strftime('%A, %B %-d. %Y')
%p.cta-button
= link_to(new_conference_conference_registration_path(@conference.short_title), class: 'btn btn-lg btn-success') do
Register Now

View file

@ -1,57 +0,0 @@
.container
.row
.col-md-12
%h2.text-center
Program
%p.lead.text-center
%span.notranslate
= @conference.short_title
has the most awesome program ever!
- if @conference.splashpage and @conference.program.tracks.any? and @conference.splashpage.include_tracks
See rock-star speakers cover the topics of
- if @conference.splashpage and @conference.splashpage.include_tracks
- @conference.program.tracks.confirmed.each_slice(3) do |slice|
.row.row-centered
- slice.each do |track|
.col-md-4.col-sm-4.col-centered.col-top.track
%h4.text-center
= track.name
= markdown(track.description)
- if track.start_date
%br
From: #{track.start_date.strftime('%A, %B %-d. %Y')}
- if track.end_date
%br
To: #{track.end_date.strftime('%A, %B %-d. %Y')}
- if track.room
%br
In: #{track.room.name}
- if @conference.program and @conference.program.schedule_public
.row
.col-md-12
%p.cta-button.text-center
= link_to(conference_schedule_path(@conference.short_title), class: 'btn btn-default btn-lg') do
Full Schedule
%h3.text-center
Don't miss out!
%br
- if @conference.program.events.highlights.any?
.row
.col-md-12
- @conference.program.events.highlights.each_slice(2) do |slice|
.row.row-centered
- slice.each do |event|
.col-md-6.col-centered.col-top.highlights
%p.text-center
%b= event.title
%h5.text-center
= markdown truncate(event.abstract, length: 500, separator: ' ')
= link_to "Read More", conference_program_proposal_path(@conference.short_title, event)
= content_for :splash_nav do
%li
=link_to('#program', class: 'smoothscroll') do
Program

View file

@ -0,0 +1,20 @@
- cache [conference.contact, '#splash#social'] do
%section#social-media
.container
.row
.col-md-12.text-center
- unless conference.contact.facebook.blank?
= link_to "#{ conference.contact.facebook }" do
%i.fa.fa-facebook-square.fa-4x
- unless conference.contact.twitter.blank?
= link_to "#{ conference.contact.twitter }" do
%i.fa.fa-twitter.fa-4x
- unless conference.contact.instagram.blank?
= link_to "#{ conference.contact.instagram }" do
%i.fa.fa-instagram.fa-4x
- unless conference.contact.googleplus.blank?
= link_to "#{ conference.contact.googleplus }" do
%i.fa.fa-google-plus-square.fa-4x
- unless conference.contact.email.blank?
= mail_to "#{ conference.contact.email }" do
%i.fa.fa-envelope-o.fa-4x

View file

@ -1,18 +0,0 @@
.container
.row
.col-md-12.text-center
- unless @conference.contact.facebook.blank?
= link_to "#{ @conference.contact.facebook }" do
%i.fa.fa-facebook-square.fa-4x
- unless @conference.contact.twitter.blank?
= link_to "#{ @conference.contact.twitter }" do
%i.fa.fa-twitter.fa-4x
- unless @conference.contact.instagram.blank?
= link_to "#{ @conference.contact.instagram }" do
%i.fa.fa-instagram.fa-4x
- unless @conference.contact.googleplus.blank?
= link_to "#{ @conference.contact.googleplus }" do
%i.fa.fa-google-plus-square.fa-4x
- unless @conference.contact.email.blank?
= mail_to "#{ @conference.contact.email }" do
%i.fa.fa-envelope-o.fa-4x

View file

@ -0,0 +1,33 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#sponsors' } Sponsors
- cache [conference, conference.sponsors, conference.try(:call_for_sponsors),
'#splash#sponsors'] do
%section#sponsors
.container
- conference.sponsorship_levels.each do |sponsorship_level|
- if sponsorship_level.sponsors.any?
.row.text-center
%h3
= sponsorship_level.title
= 'Sponsor'.pluralize(sponsorship_level.sponsors.length)
.row.row-centered
- sponsorship_level.sponsors.each do |sponsor|
.col-md-4.col-sm-4.col-centered.col-top
%a{ href: '#', data: { toggle: 'modal',
target: "#modal-sponsor-#{sponsor.id}" } }
= image_tag get_logo(sponsor),
class: ['img-responsive', 'img-sponsor',
"img-sponsor-#{sponsorship_level.position}"],
title: sponsor.name
= render 'modal_description', object: sponsor
- if conference.call_for_sponsors.try(:open?)
.row
.col-md-12
%p.text-muted.text-center
%small
Want to sponsor #{conference.short_title}?
= link_to(sponsorship_mailto(conference)) do
Please contact us!

View file

@ -1,41 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#sponsors' } Sponsors
.container
.row
.col-md-12.text-center
%h2 Sponsors
- @conference.sponsorship_levels.each do |sponsorship_level|
-if sponsorship_level.sponsors.any?
- sponsorship_level.sponsors.each_slice(3) do |slice|
.row.row-centered
- slice.each do |sponsor|
.col-md-4.col-sm-4.col-centered.col-top
%a{ href: '#', data: { toggle: 'modal', target: "#modal_#{sponsor.id}" } }
= image_tag get_logo(sponsor), class: "img-responsive img-sponsor img-sponsor-#{sponsorship_level.position}"
.modal.fade{ id: "modal_#{sponsor.id}" }
.modal-dialog
.modal-content
.modal-header
%button.close{ data: { dismiss: 'modal' } }
x
.modal-title
= sponsor.name
.modal-body.text-center
.logo
= link_to sponsor.website_url, target: '_blank' do
= image_tag get_logo(sponsor), class: "img-responsive img-sponsor img-sponsor-#{sponsorship_level.position}"
.description
= sponsor.description
.modal-footer
= link_to nil, "#{sponsor.website_url}", target: '_blank'
-if @conference.contact and !@conference.contact.sponsor_email.blank?
.row
.col-md-12
%p.text-muted.text-center
%small
Want to sponsor #{@conference.short_title}?
= link_to("mailto: #{@conference.contact.sponsor_email}?subject=#{@conference.short_title}%20Sponsorship") do
Please contact us!

View file

@ -0,0 +1,24 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#tickets' } Tickets
- cache [conference, conference.tickets, '#splash#tickets'] do
%section#tickets
.container
.row
.col-md-12.text-center
%h2
Support
= conference.title
.row.row-centered
- conference.tickets.each do |ticket|
.col-md-3.col-sm-3.col-centered.col-top
= link_to(conference_tickets_path(conference.short_title),
class: 'thumbnail') do
.caption
%h3.text-center
= ticket.title
= markdown(ticket.description)
%button.btn-block.btn.btn-lg.btn-success
%i.fa.fa-ticket.fa-fw
= humanized_money_with_symbol(ticket.price)

View file

@ -1,25 +0,0 @@
.container
.row
.col-md-12.text-center
%h2
Support
=@conference.short_title
%p.lead
To support our event you can get these tickets
- @conference.tickets.each_slice(4) do |slice|
.row.row-centered
- slice.each do |ticket|
.col-md-3.col-centered.col-top.col-sm-3
.thumbnail
%p.text-center
%i.fa.fa-ticket.fa-5x
.caption
%h3.text-center
= ticket.title
-if ticket.description.present?
= markdown(ticket.description)
%p.text-center
= link_to(conference_tickets_path(@conference.short_title), class: 'btn btn-success') do
Get Ticket
= humanized_money_with_symbol ticket.price

View file

@ -0,0 +1,17 @@
.row
.col-md-12
%h3.text-center
Tracks
.row.row-centered
- conference.confirmed_tracks.to_a.sort_by!(&:name).each do |track|
.col-md-3.col-sm-3.col-centered.col-top.track
.thumbnail
.caption
%h3.text-center
= track.name
%p.text-center
- if track.start_date && track.end_date
= date_string(track.start_date, track.end_date)
- if track.room
In #{track.room.name}
= markdown truncate(track.description, length: 200, separator: ' ')

View file

@ -0,0 +1,44 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#venue' } Venue
- cache [conference.venue, conference.venue.commercial, '#splash#venue'] do
%section#venue
- if conference.venue.location?
= render '/conferences/venue_map', conference: conference
- else
.container
.row
.col-md-6
.thumbnail#venue-pic
- if commercial = conference.venue.commercial
.flexvideo{ id: "resource-content-#{commercial.id}" }
= render 'shared/media_item',
commercial: commercial
- elsif conference.venue.picture?
= image_tag conference.venue.picture.url,
title: conference.venue.name, class: "img-responsive"
- else
%p.text-center
%span.fa.fa-university.fa-5x
.caption
%h3.text-center
= conference.venue.name
- unless conference.venue.description.blank?
= markdown(conference.venue.description)
.col-md-6
%h2
= conference.venue.city
\/
= conference.venue.country_name
%address
= conference.venue.street
%br
= conference.venue.postalcode + ','
= conference.venue.city
%br
= conference.venue.country_name
- if conference.venue.website
%br
= sanitize link_to(h(conference.venue.website),
h(conference.venue.website))

View file

@ -1,35 +0,0 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#venue' } Venue
-if @conference.venue.location?
= render '/conferences/venue_map'
-else
.container
.row
.col-md-6
.thumbnail#venue-pic
- if @conference.venue.commercial.present? and @conference.venue.commercial.persisted?
.flexvideo{ id: "resource-content-#{@conference.venue.commercial.id}"}
= render partial: 'shared/media_item', locals: { commercial: @conference.venue.commercial }
- elsif @conference.venue.picture?
= image_tag @conference.venue.picture.url, alt: @conference.venue.name, class:"img-responsive"
- else
%p.text-center
%span.fa.fa-university.fa-5x
.caption
%h3.text-center
= @conference.venue.name
- unless @conference.venue.description.blank?
= markdown(@conference.venue.description)
.col-md-6
%h2
= "#{@conference.venue.city} / #{@conference.venue.country_name}"
%address
= @conference.venue.street
%br
= "#{@conference.venue.postalcode}, #{@conference.venue.city}"
%br
= @conference.venue.country_name
- if @conference.venue.website
%br
=link_to(h(@conference.venue.website), h(@conference.venue.website)).html_safe

View file

@ -1,16 +1,29 @@
#map{style: "height: 500px;" }
#map{ style: "height: 500px;" }
- content_for(:script_body) do
- marker = escape_javascript(render '/conferences/venue_map_marker',
venue: conference.venue)
:javascript
// create a map in the "map" div, set the view to a given place and zoom
var map = L.map('map', { scrollWheelZoom: false }).setView([#{h(@conference.venue.latitude)}, #{h(@conference.venue.longitude)}], 11);
var map = L.map('map', { scrollWheelZoom: false }).setView(
[
#{conference.venue.latitude.to_f + 0.05},
#{h(conference.venue.longitude)}
], 11);
// add an OpenStreetMap tile layer
L.tileLayer('//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
attribution: 'Map data &copy; \
<a href="http://openstreetmap.org">OpenStreetMap</a> contributors, \
<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, \
Imagery © <a href="http://mapbox.com">Mapbox</a>',
maxZoom: 18
}).addTo(map);
// add a marker in the given location, attach some popup content to it and open the popup
L.marker([#{h @conference.venue.latitude}, #{h @conference.venue.longitude}]).addTo(map)
.bindPopup("#{escape_javascript(render '/conferences/venue_map_marker', venue: @conference.venue)}")
// add a marker in the given location, attach some popup content to it
// and open the popup
L.marker([
#{h conference.venue.latitude},
#{h conference.venue.longitude}
]).addTo(map)
.bindPopup("#{marker}")
.openPopup();
// Turn scrollwheel on when user clicks
map.on('focus', function(e) {

View file

@ -11,88 +11,56 @@
= @conference.title
#splash
- if @conference.splashpage
#banner
.container
.row
.col-md-8.col-md-offset-2#header
.row
.col-md-4
= image_tag(@conference.picture_url, class: 'img-responsive img-center', id: 'splash-logo') if @conference.picture?
.col-md-8
%h1
= @conference.title
%p.lead
- if @conference.venue
= "#{@conference.venue.city} / #{@conference.venue.country_name}"
- if @conference.start_date && @conference.end_date
%br
= date_string(@conference.start_date, @conference.end_date)
// header/description
= render 'header', conference: @conference
- unless @conference.description.blank?
%section#about
.container
.row
.col-md-8.col-md-offset-2
%h3.text-center
= markdown(@conference.description)
// attendance/registration
- if @conference.splashpage.include_registrations
- if @conference.registration_open?
= render 'registration', conference: @conference
- if @conference.splashpage.include_tickets && @conference.tickets.any?
= render 'tickets', conference: @conference
- if @conference.registration_open? and @conference.splashpage.include_registrations
%section#registration
= render 'registration'
// calls for content, or program
- if @conference.splashpage.include_cfp
= render 'call_for_content', conference: @conference
- if @conference.splashpage.include_program
= render 'program', conference: @conference
- if @conference.splashpage.include_program
%section#program
= render 'schedule_splashpage'
// geo
- if @conference.splashpage.include_venue && @conference.venue
= render 'venue', conference: @conference
- if @conference.splashpage.include_lodgings && @conference.lodgings.any?
= render 'lodging', conference: @conference
- if @conference.program.cfp_open? and @conference.splashpage.include_cfp
%section#callforpapers
= render 'call_for_paper'
// sponsorship
- if @conference.splashpage.include_sponsors
= render 'sponsors', conference: @conference
- if @conference.program.cfps.for_tracks.try(:open?) && @conference.splashpage.include_cfp
%section#callfortracks
= render 'call_for_tracks'
// footer
- if @conference.splashpage.include_social_media
- if @conference.contact.has_social_media?
= render 'social_media', conference: @conference
= render 'footer'
- if @conference.venue and @conference.splashpage.include_venue
%section#venue
= render 'venue'
= yield :modals
- if @conference.lodgings.any? and @conference.splashpage.include_lodgings
%section#lodging
= render 'lodging'
- if @conference.tickets.any? and @conference.splashpage.include_tickets and @conference.pending?
%section#tickets
= render 'tickets'
- if @conference.booths.confirmed.any? and @conference.splashpage.include_booths
%section#booths
= render 'booths'
- if @conference.sponsors.any? and @conference.splashpage.include_sponsors
%section#sponsors
= render 'sponsors'
- if @conference.contact.has_social_media? and @conference.splashpage.include_social_media
%section#social-media
= render 'social_media'
// grmbl
= 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() + '")');
- cache [@conference.color, '#splash#inlinejs'] do
- 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() + '")');
});
});
});

View file

@ -7,7 +7,7 @@
= link_to(edit_user_path(current_user.id)) do
%span.fa.fa-user
Edit Profile
-if @conference and @conference.program
-if @conference && @conference.program
%li
= link_to(conference_program_proposals_path(@conference.short_title)) do
%span.fa.fa-comment
@ -16,7 +16,7 @@
= link_to(conference_program_tracks_path(@conference.short_title)) do
%span.fa.fa-road
My Tracks
-if @conference && @conference.program && (@conference.program.cfps.for_booths.try(:open?) || current_user.booths.where(conference_id: @conference.id).count > 0)
-if @conference && (@conference.call_for_booths.try(:open?) || current_user.booths.where(conference_id: @conference.id).count > 0)
%li
= link_to (conference_booths_path(@conference.short_title)) do
%span.fa.fa-shopping-bag
@ -41,7 +41,7 @@
=link_to(new_admin_conference_path) do
%span.fa.fa-plus
New Conference
-if @conference and @conference.id and can? :show, @conference
-if @conference && @conference.id && can?(:show, @conference)
%li
= link_to(admin_conference_path(@conference.short_title)) do
%span.fa.fa-cog

View file

@ -12,6 +12,8 @@ Osem::Application.configure do
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
config.cache_store = :memory_store, { size: 64.megabytes }
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = false

View file

@ -46,6 +46,14 @@ Osem::Application.configure do
# Use a different cache store in production
# config.cache_store = :mem_cache_store
if ENV["MEMCACHEDCLOUD_SERVERS"]
config.cache_store = :dalli_store, ENV["MEMCACHEDCLOUD_SERVERS"].split(','), {
username: ENV["MEMCACHEDCLOUD_USERNAME"],
password: ENV["MEMCACHEDCLOUD_PASSWORD"]
}
else
config.cache_store = :memory_store, { size: 64.megabytes }
end
# Enable serving of images, stylesheets, and JavaScripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"

View file

@ -237,7 +237,7 @@ feature 'Version' do
click_link 'Edit'
uncheck('Display program')
uncheck('Display call for papers information on splashpage, while cfp is open')
uncheck('Display call for papers and call for tracks information on splashpage, while open')
uncheck('Display venue')
uncheck('Display tickets')
uncheck('Display the lodgings')

View file

@ -1,8 +1,9 @@
require 'spec_helper'
describe ApplicationHelper, type: :helper do
let(:conference) { create(:conference) }
let(:conference) { create(:full_conference) }
let(:event) { create(:event, program: conference.program) }
let(:sponsor) { create(:sponsor) }
describe '#date_string' do
it 'when conference lasts 1 day' do
@ -75,4 +76,45 @@ describe ApplicationHelper, type: :helper do
end
end
end
describe '#get_logo' do
context 'first sponsorship_level' do
before do
first_sponsorship_level = create(:sponsorship_level, position: 1)
sponsor.update_attributes(sponsorship_level: first_sponsorship_level)
end
it 'returns correct url' do
expect(get_logo(sponsor)).to match %r{.*(\bfirst/#{sponsor.logo_file_name}\b)}
end
end
context 'second sponsorship_level' do
before do
second_sponsorship_level = create(:sponsorship_level, position: 2)
sponsor.update_attributes(sponsorship_level: second_sponsorship_level)
end
it 'returns correct url' do
expect(get_logo(sponsor)).to match %r{.*(\bsecond/#{sponsor.logo_file_name}\b)}
end
end
context 'other sponsorship_level' do
before do
other_sponsorship_level = create(:sponsorship_level, position: 3)
sponsor.update_attributes(sponsorship_level: other_sponsorship_level)
end
it 'returns correct url' do
expect(get_logo(sponsor)).to match %r{.*(\bothers/#{sponsor.logo_file_name}\b)}
end
end
context 'non-sponsor' do
it 'returns correct url' do
expect(get_logo(conference)).to match %r{.*(\blarge/#{conference.logo_file_name}\b)}
end
end
end
end

View file

@ -0,0 +1,69 @@
require 'spec_helper'
describe ConferenceHelper, type: :helper do
let!(:conference) { create(:conference) }
let!(:contact) { create(:contact, conference: conference) }
describe '#one_call_open' do
it 'is falsey if neither call is open' do
expect(one_call_open(conference)).to be_falsey
end
it 'is truthy if call_for_papers is open' do
create(
:cfp,
program: conference.program,
cfp_type: 'events',
start_date: conference.start_date,
end_date: conference.end_date
)
expect(one_call_open(conference)).to be_truthy
end
it 'is truthy if call_for_tracks is open' do
create(
:cfp,
program: conference.program,
cfp_type: 'tracks',
start_date: conference.start_date,
end_date: conference.end_date
)
expect(one_call_open(conference)).to be_truthy
end
it 'is falsey if both calls are open' do
create(
:cfp,
program: conference.program,
cfp_type: 'events',
start_date: conference.start_date,
end_date: conference.end_date
)
create(
:cfp,
program: conference.program,
cfp_type: 'tracks',
start_date: conference.start_date,
end_date: conference.end_date
)
expect(one_call_open(conference)).to be_falsey
end
end
describe '#sponsorship_mailto' do
it 'constructs a mailto URL' do
expect(sponsorship_mailto(conference)).to match 'mailto:'
end
it 'points to the conference sponsor address' do
expect(sponsorship_mailto(conference)).to match contact.sponsor_email
end
it 'includes a conference identifier' do
expect(sponsorship_mailto(conference)).to match conference.short_title
end
end
end

View file

@ -1,40 +0,0 @@
require 'spec_helper'
describe SponsorsHelper, type: :helper do
let(:sponsor) { create(:sponsor) }
describe '#get_logo' do
context 'first sponsorship_level' do
before do
first_sponsorship_level = create(:sponsorship_level, position: 1)
sponsor.update_attributes(sponsorship_level: first_sponsorship_level)
end
it 'returns correct url' do
expect(get_logo(sponsor)).to match %r{.*(\bfirst/#{sponsor.logo_file_name}\b)}
end
end
context 'second sponsorship_level' do
before do
second_sponsorship_level = create(:sponsorship_level, position: 2)
sponsor.update_attributes(sponsorship_level: second_sponsorship_level)
end
it 'returns correct url' do
expect(get_logo(sponsor)).to match %r{.*(\bsecond/#{sponsor.logo_file_name}\b)}
end
end
context 'other sponsorship_level' do
before do
other_sponsorship_level = create(:sponsorship_level, position: 3)
sponsor.update_attributes(sponsorship_level: other_sponsorship_level)
end
it 'returns correct url' do
expect(get_logo(sponsor)).to match %r{.*(\bothers/#{sponsor.logo_file_name}\b)}
end
end
end
end