Merge master tidy routes

This commit is contained in:
Michael Ball 2021-03-24 13:32:40 -07:00
commit de8b06c4b3
120 changed files with 1321 additions and 1293 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View file

@ -13,11 +13,13 @@ $(function () {
$("#conference-start-datepicker").datetimepicker({
useCurrent: false,
format: "YYYY-MM-DD"
ignoreReadonly: true,
format: "YYYY-MM-DD",
});
$("#conference-end-datepicker").datetimepicker({
useCurrent: false,
ignoreReadonly: true,
format: "YYYY-MM-DD"
});

View file

@ -49,6 +49,8 @@ $(function () {
$('.' + id).collapse('hide');
$('#' + $(this).val() + '-help.' + id).collapse('show');
$('#' + $(this).val() + '-instructions.' + id).collapse('show');
});
$('.dropdown-toggle').dropdown();
@ -147,6 +149,15 @@ function word_count(text, divId, maxcount) {
});
};
function fill_if_empty(text_area, filler) {
let area = $('#' + text_area);
if (!area.val()) {
area.val(filler);
area.trigger('change');
}
}
/* Wait for the DOM to be ready before attaching events to the elements */
$( document ).ready(function() {
/* Set the minimum and maximum proposal abstract and submission text word length */
@ -155,17 +166,16 @@ $( document ).ready(function() {
var max = $selected.data("max-words");
var min = $selected.data("min-words");
// Set the filler text for the submission text
fill_if_empty('event_submission_text', $selected.data("instructions"));
$("#abstract-maximum-word-count").text(max);
$("#submission-maximum-word-count").text(max);
$("#abstract-minimum-word-count").text(min);
$("#submission-minimum-word-count").text(min);
word_count($('#event_abstract').get(0), 'abstract-count', max);
word_count($('#event_submission_text').get(0), 'submission-count', max);
// Set the placeholder text for the abstract
$('#event_submission_text').attr("placeholder", $selected.data("help"));
})
.trigger('change');
}).trigger('change');
/* Count the proposal abstract length */
$("#event_abstract").bind('change keyup paste input', function() {
@ -180,6 +190,18 @@ $( document ).ready(function() {
var max = $selected.data("max-words");
word_count(this, 'submission-count', max);
});
/* Listen for reset template button, wait for confirm, and reset. */
$('.js-resetSubmissionText').click((e) => {
let $selected = $("#event_event_type_id option:selected");
let $this = $(e.target);
let affirm = confirm($this.data('confirm'));
if (affirm) {
let sub_text = $('#event_submission_text');
sub_text.val($selected.data('instructions'));
sub_text.trigger('change');
}
});
});
/* Commodity function for modal windows */

View file

@ -0,0 +1,40 @@
html {
scroll-behavior: smooth;
}
body {
background: #fff;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.06);
color: #000;
font-family: 'Montserrat', sans-serif;
font-size: 16px;
line-height: 1.5;
margin: 0 auto;
}
h1,
h3,
h4,
h5,
h6 {
font-weight: 400;
line-height: 1.3;
}
p {
color: #0B3559;
font-weight: 400;
line-height: 2;
}
#border {
background-color: #0B3559;
padding: 25px;
color:#fff;
}
#content {
background-color: #fff;
padding: 100px;
color: #0B3559;
}

View file

@ -1,26 +1,34 @@
@import "breakpoints.scss";
.dashbox span.fa {
line-height: 1.1em;
margin-bottom: 2px;
@include breakpoint(xs) {
font-size: 1.5em;
}
@include breakpoint(sm) {
font-size: 3em;
font-size: 2em;
}
@include breakpoint(md) {
font-size: 4em;
font-size: 3.5em;
}
@include breakpoint(lg) {
font-size: 5em;
}
}
.dashbox {
padding-top: 20px;
padding-bottom: 20px;
}
.dashbox.panel {
padding: 10px;
display: -webkit-flex;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.4rem;
line-height: 1.6rem;
.dashbox label {
display: block;
font-size: 1.1em;
label {
line-height: 2rem;
}
}
.todolist-missing span {

View file

@ -124,8 +124,7 @@ module Admin
# current_user.last_sign_in_at
# ).count
# Step by step list
# @conference_progress = @conference.get_status
@conference_todo_list = @conference.get_status
# Line charts
@registrations = @conference.get_registrations_per_week

View file

@ -49,7 +49,7 @@ module Admin
private
def event_type_params
params.require(:event_type).permit(:title, :length, :minimum_abstract_length, :maximum_abstract_length, :color, :conference_id, :description)
params.require(:event_type).permit(:title, :length, :minimum_abstract_length, :maximum_abstract_length, :submission_instructions, :color, :conference_id, :description)
end
end
end

View file

@ -66,6 +66,16 @@ module Admin
def edit; end
def destroy
if @user.destroy
redirect_to admin_users_path,
notice: "User #{@user.id} (#{@user.email}) deleted."
else
redirect_to admin_users_path,
error: "User #{@user.id} (#{@user.emai}) could not be deleted. #{@user.full_messages.join(',')}"
end
end
private
def user_params

View file

@ -6,8 +6,11 @@ class ConferencesController < ApplicationController
load_and_authorize_resource find_by: :short_title, except: :show
def index
@current = Conference.where('end_date >= ?', Date.current).reorder(start_date: :asc)
@antiquated = Conference.where('end_date < ?', Date.current)
@current = Conference.upcoming.reorder(start_date: :asc)
@antiquated = Conference.past
if @antiquated.empty? && @current.empty? && User.empty?
render :new_install
end
end
def show
@ -68,6 +71,47 @@ class ConferencesController < ApplicationController
end
end
def calendar
respond_to do |format|
format.ics do
calendar = Icalendar::Calendar.new
Conference.all.each do |conf|
if params[:full]
event_schedules = conf.program.selected_event_schedules(
includes: [{ event: %i[event_type speakers submitter] }]
)
calendar = icalendar_proposals(calendar, event_schedules.map(&:event), conf)
else
calendar.event do |e|
e.dtstart = conf.start_date
e.dtstart.ical_params = { 'VALUE'=>'DATE' }
e.dtend = conf.end_date
e.dtend.ical_params = { 'VALUE'=>'DATE' }
e.duration = "P#{(conf.end_date - conf.start_date + 1).floor}D"
e.created = conf.created_at
e.last_modified = conf.updated_at
e.summary = conf.title
e.description = conf.description
e.uid = conf.guid
e.url = conference_url(conf.short_title)
v = conf.venue
if v
e.geo = v.latitude, v.longitude if v.latitude && v.longitude
location = ''
location += "#{v.street}, " if v.street
location += "#{v.postalcode} #{v.city}, " if v.postalcode && v.city
location += v.country_name if v.country_name
e.location = location if location
end
end
end
end
calendar.publish
render inline: calendar.to_ical
end
end
end
private
def conference_finder_conditions

View file

@ -16,6 +16,7 @@ class PaymentsController < ApplicationController
raise CanCan::AccessDenied.new('Nothing to pay for!', :new, Payment)
end
@has_registration_ticket = params[:has_registration_ticket]
@unpaid_ticket_purchases = current_user.ticket_purchases.unpaid.by_conference(@conference)
end
@ -24,8 +25,15 @@ class PaymentsController < ApplicationController
if @payment.purchase && @payment.save
update_purchased_ticket_purchases
redirect_to conference_physical_tickets_path,
notice: 'Thanks! Your ticket is booked successfully.'
has_registration_ticket = params[:has_registration_ticket]
if has_registration_ticket == 'true'
redirect_to new_conference_conference_registration_path(@conference.short_title),
notice: 'Thanks! Your ticket is booked successfully. Please register for the conference.'
else
redirect_to conference_physical_tickets_path,
notice: 'Thanks! Your ticket is booked successfully.'
end
else
@total_amount_to_pay = Ticket.total_price(@conference, current_user, paid: false)
@unpaid_ticket_purchases = current_user.ticket_purchases.unpaid.by_conference(@conference)

View file

@ -21,6 +21,12 @@ class SchedulesController < ApplicationController
format.xml do
@events_xml = event_schedules.map(&:event).group_by{ |event| event.time.to_date } if event_schedules
end
format.ics do
cal = Icalendar::Calendar.new
cal = icalendar_proposals(cal, event_schedules.map(&:event), @conference)
cal.publish
render inline: cal.to_ical
end
format.html do
@rooms = @conference.venue.rooms if @conference.venue

View file

@ -8,23 +8,42 @@ class TicketPurchasesController < ApplicationController
def create
current_user.ticket_purchases.by_conference(@conference).unpaid.destroy_all
# Create a ticket purchase which can be paid or unpaid
count_registration_tickets_before = current_user.count_registration_tickets(@conference)
message = TicketPurchase.purchase(@conference, current_user, params[:tickets].try(:first))
if message.blank?
if current_user.ticket_purchases.by_conference(@conference).unpaid.any?
redirect_to new_conference_payment_path,
notice: 'Please pay here to get tickets.'
elsif current_user.ticket_purchases.by_conference(@conference).paid.any?
redirect_to conference_physical_tickets_path,
notice: 'You already have tickets for the conference.'
elsif @conference.tickets.for_registration.any?
redirect_to conference_tickets_path(@conference.short_title),
error: 'Please get at least one ticket to continue.'
else
redirect_to conference_conference_registration_path(@conference.short_title)
end
else
# The new ticket_purchase has been added to the database. current_user.ticket_purchases contains the new one.
count_registration_tickets_after = current_user.count_registration_tickets(@conference)
# Failed to create ticket purchase
unless message.blank?
redirect_to conference_tickets_path(@conference.short_title),
error: "Oops, something went wrong with your purchase! #{message}"
return
end
# Current user already paid for a registration ticket and the current ticket purchase contains one
if count_registration_tickets_before == 1 && count_registration_tickets_after > 1
redirect_to conference_physical_tickets_path,
error: 'You already have one registration ticket for the conference.'
return
end
# User needs to pay for tickets if any of them is not free.
if current_user.ticket_purchases.by_conference(@conference).unpaid.any?
has_registration_ticket = count_registration_tickets_before.zero? && count_registration_tickets_after == 1
redirect_to new_conference_payment_path(has_registration_ticket: has_registration_ticket),
notice: 'Please pay here to get tickets.'
return
end
# Redirect to registration page for a user who didn't have a registration ticket and is purchasing one
if count_registration_tickets_before.zero? && count_registration_tickets_after == 1
redirect_to new_conference_conference_registration_path(@conference.short_title),
notice: 'Thanks! Your ticket is booked successfully. Please register for the conference.'
else
redirect_to conference_physical_tickets_path,
notice: 'Thanks! Your ticket is booked successfully.'
end
end

View file

@ -35,7 +35,8 @@ class UserDatatable < AjaxDatatablesRails::Base
roles: record.roles.any? ? show_roles(record.get_roles) : 'None',
view_url: admin_user_path(record),
edit_url: edit_admin_user_path(record),
DT_RowId: record.id
DT_RowId: record.id,
confirmed: record.confirmed_at.present?
}
end
end

View file

@ -1,5 +1,8 @@
# frozen_string_literal: true
DEFAULT_LOGO = 'snapcon_logo.png'
DEFAULT_COLOR = '#0B3559'
module ConferenceHelper
# Return true if only call_for_papers or call_for_tracks or call_for_booths is open
def one_call_open(*calls)
@ -27,4 +30,51 @@ module ConferenceHelper
markdown(ticket.description.split("\n").first&.strip)
end
def conference_logo_url(conference)
if conference.picture.present?
conference.picture.thumb.url
elsif conference.organization.picture.present?
conference.organization.picture.thumb.url
else
DEFAULT_LOGO
end
end
def conference_color(conference)
if conference.color.present?
conference.color
else
DEFAULT_COLOR
end
end
# adds events to icalendar for proposals in a conference
def icalendar_proposals(calendar, proposals, conference)
proposals.each do |proposal|
calendar.event do |e|
e.dtstart = proposal.time
e.dtend = proposal.time + proposal.event_type.length * 60
e.duration = "PT#{proposal.event_type.length}M"
e.created = proposal.created_at
e.last_modified = proposal.updated_at
e.summary = proposal.title
e.description = proposal.abstract
e.uid = proposal.guid
e.url = conference_program_proposal_url(conference.short_title, proposal.id)
v = conference.venue
if v
e.geo = v.latitude, v.longitude if v.latitude && v.longitude
location = ''
location += "#{proposal.room.name} - " if proposal.room.name
location += " - #{v.street}, " if v.street
location += "#{v.postalcode} #{v.city}, " if v.postalcode && v.city
location += "#{v.country_name}, " if v.country_name
e.location = location
end
e.categories = conference.title, "Difficulty: #{proposal.difficulty_level.title}", "Track: #{proposal.track.name}"
end
end
calendar
end
end

View file

@ -60,6 +60,20 @@ module EventsHelper
"#{event.average_rating}/#{max_rating}, #{pluralize(event.voters.length, 'vote')}"
end
def event_type_options(event_types)
event_types.map do |type|
[
"#{type.title} - #{show_time(type.length)}",
type.id,
data: {
min_words: type.minimum_abstract_length,
max_words: type.maximum_abstract_length,
instructions: type.submission_instructions
}
]
end
end
def event_type_dropdown(event, event_types, conference_id)
selection = event.event_type.try(:title) || 'Event Type'
options = event_types.collect do |event_type|

View file

@ -5,21 +5,26 @@ EMAIL_TEMPLATE = 'email_template'
YTLF_TICKET_ID = 50
class Mailbot < ActionMailer::Base
def registration_mail(conference, user)
@email_body = conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.registration_body)
@logo = conference.picture.thumb.url
helper ConferenceHelper
mail(to: user.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.registration_subject,
template_name: EMAIL_TEMPLATE)
default bcc: SNAPCON_BCC_ADDRESS,
template_name: EMAIL_TEMPLATE,
content_type: 'text/html',
to: -> { @user.email },
from: -> { @conference.contact.email }
def registration_mail(conference, user)
@user = user
@conference = conference
@email_body = @conference.email_settings.generate_email_on_conf_updates(@conference, @user, @conference.email_settings.registration_body)
mail(subject: @conference.email_settings.registration_subject)
end
def ticket_confirmation_mail(ticket_purchase)
@ticket_purchase = ticket_purchase
@conference = ticket_purchase.conference
@user = ticket_purchase.user
@conference = ticket_purchase.conference
PhysicalTicket.last(ticket_purchase.quantity).each do |physical_ticket|
pdf = TicketPdf.new(@conference, @user, physical_ticket, @conference.ticket_layout.to_sym, "ticket_for_#{@conference.short_title}_#{physical_ticket.id}")
@ -31,138 +36,100 @@ class Mailbot < ActionMailer::Base
template_name = 'young_thinkers_ticket_confirmation_template'
end
mail(to: @user.email,
bcc: SNAPCON_BCC_ADDRESS,
from: @conference.contact.email,
template_name: template_name,
subject: "#{@conference.title} | Ticket Confirmation and PDF!")
mail(subject: "#{@conference.title} | Ticket Confirmation and PDF!",
template_name: template_name)
end
def acceptance_mail(event)
conference = event.program.conference
@user = event.submitter
@conference = event.program.conference
@email_body = @conference.email_settings.generate_event_mail(event, @conference.email_settings.accepted_body)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_event_mail(event, conference.email_settings.accepted_body)
mail(to: event.submitter.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.accepted_subject,
template_name: EMAIL_TEMPLATE)
mail(subject: @conference.email_settings.accepted_subject)
end
def submitted_proposal_mail(event)
conference = event.program.conference
@user = event.submitter
@conference = event.program.conference
@email_body = @conference.email_settings.generate_event_mail(event, @conference.email_settings.submitted_proposal_body)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_event_mail(event, conference.email_settings.submitted_proposal_body)
mail(to: event.submitter.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.submitted_proposal_subject,
template_name: EMAIL_TEMPLATE)
mail(subject: @conference.email_settings.submitted_proposal_subject)
end
def rejection_mail(event)
conference = event.program.conference
@user = event.submitter
@conference = event.program.conference
@email_body = @conference.email_settings.generate_event_mail(event, @conference.email_settings.rejected_body)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_event_mail(event, conference.email_settings.rejected_body)
mail(to: event.submitter.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.rejected_subject,
template_name: EMAIL_TEMPLATE)
mail(subject: @conference.email_settings.rejected_subject)
end
def confirm_reminder_mail(event)
conference = event.program.conference
@user = event.submitter
@conference = event.program.conference
@email_body = @conference.email_settings.generate_event_mail(event, @conference.email_settings.confirmed_without_registration_body)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_event_mail(event, conference.email_settings.confirmed_without_registration_body)
mail(to: event.submitter.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.confirmed_without_registration_subject,
template_name: EMAIL_TEMPLATE)
mail(subject: @conference.email_settings.confirmed_without_registration_subject)
end
def conference_date_update_mail(conference, user)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.conference_dates_updated_body)
@user = user
@conference = conference
@email_body = @conference.email_settings.generate_email_on_conf_updates(@conference, @user, @conference.email_settings.conference_dates_updated_body)
mail(to: user.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.conference_dates_updated_subject,
template_name: EMAIL_TEMPLATE)
mail(subject: @conference.email_settings.conference_dates_updated_subject)
end
def conference_registration_date_update_mail(conference, user)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.conference_registration_dates_updated_body)
@user = user
@conference = conference
@email_body = @conference.email_settings.generate_email_on_conf_updates(@conference, @user, @conference.email_settings.conference_registration_dates_updated_body)
mail(to: user.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.conference_registration_dates_updated_subject,
template_name: EMAIL_TEMPLATE)
mail(subject: @conference.email_settings.conference_registration_dates_updated_subject)
end
def conference_venue_update_mail(conference, user)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.venue_updated_body)
@user = user
@conference = conference
@email_body = @conference.email_settings.generate_email_on_conf_updates(@conference, @user, @conference.email_settings.venue_updated_body)
mail(to: user.email,
bcc: SNAPCON_BCC_ADDRESS,
from: conference.contact.email,
subject: conference.email_settings.venue_updated_subject,
template_name: EMAIL_TEMPLATE)
mail(subject: @conference.email_settings.venue_updated_subject)
end
def conference_schedule_update_mail(conference, user)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.program_schedule_public_body)
@user = user
@conference = conference
@email_body = @conference.email_settings.generate_email_on_conf_updates(@conference, @user, @conference.email_settings.program_schedule_public_body)
mail(to: user.email,
from: conference.contact.email,
subject: conference.email_settings.program_schedule_public_subject,
template_name: EMAIL_TEMPLATE)
mail(bcc: nil,
subject: @conference.email_settings.program_schedule_public_subject)
end
def conference_cfp_update_mail(conference, user)
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_email_on_conf_updates(conference, user, conference.email_settings.cfp_dates_updated_body)
@user = user
@conference = conference
@email_body = @conference.email_settings.generate_email_on_conf_updates(@conference, @user, @conference.email_settings.cfp_dates_updated_body)
mail(to: user.email,
from: conference.contact.email,
subject: conference.email_settings.cfp_dates_updated_subject,
template_name: EMAIL_TEMPLATE)
mail(bcc: nil,
subject: @conference.email_settings.cfp_dates_updated_subject)
end
def conference_booths_acceptance_mail(booth)
conference = booth.conference
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_booth_mail(booth, conference.email_settings.booths_acceptance_body)
@user = booth.submitter
@conference = booth.conference
@email_body = @conference.email_settings.generate_booth_mail(booth, @conference.email_settings.booths_acceptance_body)
mail(to: booth.submitter.email,
from: conference.contact.email,
subject: conference.email_settings.booths_acceptance_subject,
template_name: EMAIL_TEMPLATE)
mail(bcc: nil,
subject: @conference.email_settings.booths_acceptance_subject)
end
def conference_booths_rejection_mail(booth)
conference = booth.conference
@logo = conference.picture.thumb.url
@email_body = conference.email_settings.generate_booth_mail(booth, conference.email_settings.booths_rejection_body)
@user = booth.submitter
@conference = booth.conference
@email_body = @conference.email_settings.generate_booth_mail(booth, @conference.email_settings.booths_rejection_body)
mail(to: booth.submitter.email,
from: conference.contact.email,
subject: conference.email_settings.booths_rejection_subject,
template_name: EMAIL_TEMPLATE)
mail(bcc: nil,
subject: @conference.email_settings.booths_rejection_subject)
end
def event_comment_mail(comment, user)
@ -171,8 +138,7 @@ class Mailbot < ActionMailer::Base
@conference = @event.program.conference
@user = user
mail(to: @user.email,
from: @conference.contact.email,
mail(bcc: nil,
template_name: 'comment_template',
subject: "New comment has been posted for #{@event.title}")
end

View file

@ -61,6 +61,9 @@ class Conference < ApplicationRecord
has_one :email_settings, dependent: :destroy
has_one :program, dependent: :destroy
has_one :venue, dependent: :destroy
delegate :city, :country_name, to: :venue, allow_nil: true
delegate :name, :street, to: :venue, prefix: true, allow_nil: true
has_many :ticket_purchases, dependent: :destroy
has_many :physical_tickets, through: :ticket_purchases
has_many :payments, dependent: :destroy

View file

@ -274,7 +274,7 @@ class Event < ApplicationRecord
biographies: speakers.all? { |speaker| !speaker.biography.blank? },
subtitle: !subtitle.blank?,
track: (!track.blank? unless program.tracks.empty?),
difficulty_level: !difficulty_level.blank?,
difficulty_level: (difficulty_level.present? unless program.difficulty_levels.empty?),
title: true,
abstract: true
}.with_indifferent_access

View file

@ -10,6 +10,7 @@
# length :integer default(30)
# maximum_abstract_length :integer default(500)
# minimum_abstract_length :integer default(0)
# submission_instructions :text
# title :string not null
# created_at :datetime
# updated_at :datetime

View file

@ -24,8 +24,8 @@ class SurveyQuestion < ActiveRecord::Base
validates :title, presence: true
validates :possible_answers, :max_choices, :min_choices, presence: true, if: :choice?
validates :min_choices, numericality: { greater_than_or_equal_to: 1 }, allow_blank: true
validates :max_choices, numericality: { greater_than_or_equal_to: 1 }, allow_blank: true
validates :min_choices, numericality: { greater_than_or_equal_to: 1 }, allow_blank: true, if: :choice?
validates :max_choices, numericality: { greater_than_or_equal_to: 1 }, allow_blank: true, if: :choice?
validate :max_choices_greater_than_min

View file

@ -346,6 +346,17 @@ class User < ApplicationRecord
events.where(program_id: conference.program.id, 'event_users.event_role': 'volunteer')
end
def count_registration_tickets(conference)
count = 0
ticket_purchases.by_conference(conference).each do |ticket_purchase|
if ticket_purchase.ticket.registration_ticket
count += 1
end
end
count
end
def self.empty?
User.count == 1 && User.first.email == 'deleted@localhost.osem'
end

View file

@ -69,9 +69,9 @@ class TicketPdf < Prawn::Document
draw_text @conference.title.to_s, at: [@mid_horizontal + 30, cursor - 30], size: 12
draw_text @conference.organization.name.to_s, at: [@mid_horizontal + 30, cursor - 50], size: 12
if @conference.venue
draw_text @conference.venue.name, at: [@mid_horizontal + 30, cursor - 70]
draw_text @conference.venue.street, at: [@mid_horizontal + 30, cursor - 90]
draw_text @conference.venue.city, at: [@mid_horizontal + 30, cursor - 110]
draw_text @conference.venue_name, at: [@mid_horizontal + 30, cursor - 70]
draw_text @conference.venue_street, at: [@mid_horizontal + 30, cursor - 90]
draw_text @conference.city, at: [@mid_horizontal + 30, cursor - 110]
end
move_up 130
move_down @mid_vertical

View file

@ -6,6 +6,8 @@ class PictureUploader < CarrierWave::Uploader::Base
include CarrierWave::Compatibility::Paperclip
include CarrierWave::BombShelter
storage :file
# use cloudinary if it's configured
if Cloudinary.config.cloud_name
# use https by default

View file

@ -1,13 +1,14 @@
.list-group
%li{ 'class' => "list-group-item #{hidden_if_conference_over(conference)}" }
%ul.list-group
.list-group-item
%h4
Conference progress
.progress
.progress-bar{ 'role' => 'progressbar', 'aria-valuenow' => "#{conference_progress['process']}", 'aria-valuemin' => '0',
'aria-valuemax' => '100', 'style' => "width: #{conference_progress['process']}%;" }
.progress-bar{ role: 'progressbar', 'aria-valuenow': conference_progress['process'],
'aria-valuemin': 0, 'aria-valuemax': 100,
style: "width: #{conference_progress['process']}%;" }
= conference_progress['process'] + '%'
%li{ 'class' => "list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['registration'])}" }
%span{ 'class' => icon_for_todo(conference_progress['registration']) }
%li.list-group-item{ class: class_for_todo(conference_progress['registration']) }
%span{ class: icon_for_todo(conference_progress['registration']) }
- if can? :update, @conference
- if conference.registration_period
= link_to 'Set up registration period', edit_admin_conference_registration_period_path(conference_progress['short_title'])
@ -15,14 +16,14 @@
= link_to 'Set up registration period', new_admin_conference_registration_period_path(conference_progress['short_title'])
- else
Set up registration period
%li{ 'class' => "list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['cfp'])}" }
%span{ 'class' => icon_for_todo(conference_progress['cfp']) }
%li.list-group-item{ class: class_for_todo(conference_progress['cfp']) }
%span{ class: icon_for_todo(conference_progress['cfp']) }
- if can? :update, Cfp.new(program_id: @program.id)
= link_to 'Set up call for papers', admin_conference_program_cfps_path(conference_progress['short_title'])
- else
Set up call for papers
%li{'class'=>"list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['venue'])}"}
%span{'class'=>icon_for_todo(conference_progress['venue'])}
%li.list-group-item{ class: class_for_todo(conference_progress['venue']) }
%span{ class: icon_for_todo(conference_progress['venue'])}
- if can? :update, Venue.new(conference: @conference)
- @conference.reload
- if conference.venue
@ -32,32 +33,32 @@
- else
- @conference.reload
Add venue
%li{ 'class' => "list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['rooms'])}" }
%span{ 'class' => icon_for_todo(conference_progress['rooms']) }
%li.list-group-item{ class: class_for_todo(conference_progress['rooms']) }
%span{ class: icon_for_todo(conference_progress['rooms']) }
- if @conference.venue && (can? :update, @conference.venue.rooms.build)
= link_to 'Add rooms', admin_conference_venue_rooms_path(conference_progress['short_title'])
- else
Add rooms
%li{ 'class' => "list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['tracks'])}" }
%span{ 'class' => icon_for_todo(conference_progress['tracks']) }
%li.list-group-item{ class: class_for_todo(conference_progress['tracks']) }
%span{ class: icon_for_todo(conference_progress['tracks']) }
- if can? :update, @conference.program.tracks.build
= link_to 'Add tracks', admin_conference_program_tracks_path(conference_progress['short_title'])
- else
Add tracks
%li{ 'class' => "list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['event_types'])}" }
%span{ 'class' => icon_for_todo(conference_progress['event_types']) }
%li{ class: "list-group-item #{class_for_todo(conference_progress['event_types'])}" }
%span{ class: icon_for_todo(conference_progress['event_types']) }
- if can? :update, @conference.program.event_types.build
= link_to 'Add event types', admin_conference_program_event_types_path(conference_progress['short_title'])
- else
Add event types
%li{ 'class' => "list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['difficulty_levels'])}" }
%span{ 'class' => icon_for_todo(conference_progress['difficulty_levels']) }
%li{ class: "list-group-item #{class_for_todo(conference_progress['difficulty_levels'])}" }
%span{ class: icon_for_todo(conference_progress['difficulty_levels']) }
- if can? :update, @conference.program.difficulty_levels.build
= link_to 'Add difficulty levels', admin_conference_program_difficulty_levels_path(conference_progress['short_title'])
- else
Add difficulty levels
%li{ class: "list-group-item #{hidden_if_conference_over(conference)} #{class_for_todo(conference_progress['splashpage'])}" }
%span{ 'class' => icon_for_todo(conference_progress['splashpage']) }
%li.list-group-item{ class: "#{class_for_todo(conference_progress['splashpage'])}" }
%span{ class: icon_for_todo(conference_progress['splashpage']) }
- if can? :update, @conference
= link_to 'Set up a Splashpage', admin_conference_splashpage_path(conference_progress['short_title'])
- else

View file

@ -9,24 +9,27 @@
= semantic_form_for(@conference, url: admin_conference_path(@conference.short_title), html: {multipart: true}) do |f|
= f.input :title, hint: "The full title of the conference, e.g. 'openSUSE Conference 2014'"
= f.input :short_title, hint: "A short title, e.g. 'oSC14', to be used in URLs"
= f.input :description, hint: markdown_hint('A description of the conference.'), input_html: { rows: 5, data: { provide: 'markdown' } }
= f.input :color, hint: 'The color will be used eg for the dashboard.', input_html: {size: 6, type: 'color'}
= f.label 'Conference Logo'
= f.input :description,
hint: markdown_hint('A description of the conference. (Supports unsafe HTML.)'),
input_html: { rows: 5, data: { provide: 'markdown' } }
= f.input :color, hint: 'The will be used in emails.',
input_html: {size: 6, type: 'color'}
= f.label 'Conference Logo', for: 'conference_picture'
%br
- if @conference.picture?
= image_tag @conference.picture.thumb.url
= f.input :picture, label: false, hint: 'This will be displayed on the front page.'
= f.input :picture, label: false, hint: 'This will be shown in the navigation bar and emails.'
= f.hidden_field :picture_cache
= f.input :custom_css,
hint: "Add Custon CSS to the main page. You might find the class '.conference-#{@conference.short_title}' useful.",
input_html: { rows: 5 }
hint: "Add custon CSS to all pages within the conference. The class <code>.conference-#{@conference.short_title}</code> is included on the body element.".html_safe,
input_html: { rows: 10, style: 'font-family: monospace' }
= f.input :ticket_layout, as: :select, collection: Conference.ticket_layouts.keys, hint: "Layout type for tickets of the conference."
= f.inputs name: 'Scheduling' do
= f.input :timezone, as: :time_zone, hint: 'The conference time zone'
= f.input :start_date, as: :string, input_html: { id: 'conference-start-datepicker', readonly: 'readonly' }
= f.input :end_date, as: :string, input_html: { id: 'conference-end-datepicker', readonly: 'readonly' }
= f.input :start_date, as: :string, input_html: { id: 'conference-start-datepicker' }
= f.input :end_date, as: :string, input_html: { id: 'conference-end-datepicker' }
= f.input :start_hour, input_html: {size: 2, type: 'number', min: 0, max: 23}, hint: rescheduling_hint(@affected_event_count)
= f.input :end_hour, input_html: {size: 2, type: 'number', min: 1, max: 24}, hint: rescheduling_hint(@affected_event_count)
= f.inputs name: 'Registrations' do

View file

@ -3,16 +3,16 @@
Dashboard for #{@conference.title}
%hr
.row
.col-sm-3.col-xs-3
.col-sm-3.col-xs-6
= render "big_statistic",
icon: "user", subtitle: "Registration", value: @total_reg, delta: @new_reg
.col-sm-3.col-xs-3
.col-sm-3.col-xs-6
= render "big_statistic",
icon: "check-square", subtitle: "Submission", value: @total_submissions, delta: @new_submissions
.col-sm-3.col-xs-3
.col-sm-3.col-xs-6
= render "big_statistic",
icon: "file-text", subtitle: "Hour", value: @program_length, delta: @new_program_length
.col-sm-3.col-xs-3
.col-sm-3.col-xs-6
= render "big_statistic",
icon: "archive", subtitle: "Withdrawn", value: @total_withdrawn, delta: @new_withdrawn
@ -29,8 +29,20 @@
= render 'line_chart',
title: 'Submissions per week', data: @submissions
.col-md-4
-# = render 'todo_list',
-# conference_progress: @conference_progress, conference: @conference
- unless @conference.ended?
= render 'todo_list',
conference_progress: @conference_todo_list, conference: @conference
- else
.list-group
.list-group-item
%h4
Conference Progress
.progress
.progress-bar{ role: 'progressbar', 'aria-valuenow': 100,
'aria-valuemin': 0, 'aria-valuemax': 100,
style: 'width: 100%;' }
Conference Complete!
.row#tickets
.col-md-8
= render 'line_chart',
@ -43,14 +55,15 @@
%a{ href: '#distribution_all', 'data-toggle' => 'tab' }
%span.fa.fa-star
All
%li
%a{ href: '#distribution_confirmed', 'data-toggle' => 'tab' }
%span.fa.fa-comment
Confirmed
%li
%a{ href: '#distribution_withdrawn', 'data-toggle' => 'tab' }
%span.fa.fa-archive
Withdrawn
-# TODO-SNAP: Disabled for Snap!Con
%li
%a{ href: '#distribution_confirmed', 'data-toggle' => 'tab' }
%span.fa.fa-comment
Confirmed
%li
%a{ href: '#distribution_withdrawn', 'data-toggle' => 'tab' }
%span.fa.fa-archive
Withdrawn
.tab-content
.tab-pane.active#distribution_all
.row
@ -58,33 +71,33 @@
= render 'donut_chart', title: 'Event types',
combined_data: @event_type_distribution
.col-md-4
-# = render 'donut_chart', title: 'Difficulty levels',
-# combined_data: @difficulty_levels_distribution
= render 'donut_chart', title: 'Difficulty levels',
combined_data: @difficulty_levels_distribution
.col-md-4
-# = render 'donut_chart', title: 'Tracks',
-# combined_data: @tracks_distribution
.tab-pane#distribution_confirmed
.row
.col-md-4
-# = render 'donut_chart', title: 'Event types',
-# combined_data: @event_type_distribution_confirmed
.col-md-4
-# = render 'donut_chart', title: 'Difficulty levels',
-# combined_data: @difficulty_levels_distribution_confirmed
.col-md-4
-# = render 'donut_chart', title: 'Tracks',
-# combined_data: @tracks_distribution_confirmed
.tab-pane#distribution_withdrawn
= render 'donut_chart', title: 'Tracks',
combined_data: @tracks_distribution
-# .tab-pane#distribution_withdrawn
.row
.col-md-4
= render 'donut_chart', title: 'Event types',
combined_data: @event_type_distribution_withdrawn
.col-md-4
= render 'donut_chart', title: 'Difficulty levels',
combined_data: @difficulty_levels_distribution_withdrawn
combined_data: @difficulty_levels_distribution
.col-md-4
= render 'donut_chart', title: 'Tracks',
combined_data: @tracks_distribution_withdrawn
combined_data: @tracks_distribution
-# .tab-pane#distribution_confirmed
.row
.col-md-4
= render 'donut_chart', title: 'Event types',
combined_data: @event_type_distribution_confirmed
.col-md-4
= render 'donut_chart', title: 'Difficulty levels',
combined_data: @difficulty_levels_distribution_confirmed
.col-md-4
= render 'donut_chart', title: 'Tracks',
combined_data: @tracks_distribution_confirmed
.row
.col-md-8

View file

@ -15,6 +15,7 @@
= 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 :submission_instructions, as: :text, hint: markdown_hint, input_html: { rows: 5, data: { provide: 'markdown-editable' } }
= f.input :color, input_html: { size: 6, type: 'color' }
%p.text-right
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }

View file

@ -10,6 +10,7 @@
%thead
%th Title
%th Description
%th Instructions
%th Length
%th Abstract Length
%th Color
@ -21,6 +22,8 @@
= event_type.title
%td
= markdown(event_type.description)
%td
= markdown(event_type.submission_instructions)
%td
= event_type.length
Minutes

View file

@ -15,7 +15,7 @@
.row
.col-md-12
= f.input :title
= f.input :title, input_html: { autofocus: true }
= f.input :mandatory
.survey-possible-answers{ class: @survey_question.choice? ? '' : 'hidden' }
= f.input :possible_answers, hint: 'Comma separated', input_html: { rows: 3 }

View file

@ -7,4 +7,4 @@
.panel-body
- question_replies = survey_question.survey_replies
- if question_replies.any?
= pie_chart question_replies.group(:text).count, library: { legend: 'bottom', plotOptions: { pie: { dataLabels: { enabled: false }, showInLegend: true } } }
= pie_chart question_replies.group(:text).count, library: { legend: { position: 'bottom' }, plotOptions: { pie: { dataLabels: { enabled: false }, showInLegend: true } } }

View file

@ -20,6 +20,7 @@
%th{ width: '0' } Conferences Attended
%th{ width: '50%' } Roles
%th{ width: '0' } Actions
%th{ style: 'display: none' } Confirmed?
%tbody
:javascript
@ -37,6 +38,7 @@
{
"data": "confirmed_at",
"render": function (data, type, row, meta) {
console.log(meta)
return '<input type="checkbox" class="switch-checkbox" '+
'id="user_'+row.id+'_confirmed" '+
'name="user_'+row.id+'_confirmed" '+
@ -73,6 +75,11 @@
'<a class="btn-primary" href="'+data.edit_url+'">Edit</a>'+
'</div>';
}
},
{
"data": "confirmed",
"className": 'hidden',
"render": false
}
]
});

View file

@ -12,8 +12,10 @@
.tab-content
#user-info-content.tab-pane{class: "#{'active' unless params[:tab] == 'submissions-content'}"}
- if can? :edit, @user
.pull-right
.pull-right.btn-group
= link_to 'Edit', edit_admin_user_path(@user), class: 'btn btn-primary'
= link_to 'Delete', admin_user_path(@user),method: :delete, class: 'btn btn-danger',
data: {confirm: "Are you sure?"}
%table.table
- @show_attributes.each do |attr|
%tr

View file

@ -1,13 +1,12 @@
- reverse ||= false
- variant = variant_from_delta(delta, reverse: reverse)
.dashbox.text-center
%span.fa
= fa_icon(icon)
= value
%p.text-nowrap
%small
.dashbox.panel.panel-primary
.paenl-body.text-center
%span.fa
= fa_icon(icon)
= value
%p
= subtitle.pluralize(value)
%span.label{ class: "label-#{variant}" }
= delta
since you last logged in
.label{ class: "label-#{variant}" }
= delta || 0
since last log in

View file

@ -1,33 +1,39 @@
.panel.panel-default{class: ("panel-success" if event.registrations.include?(@registration)) }
.panel.panel-default{ class: ('panel-success' if event.registrations.include?(registration)) }
.panel-heading
%label{for: "registration_event_ids_#{event.id}"}
%h3{style: 'margin: 0 auto;'}
= hidden_field_tag "registration[event_ids][]", nil
= check_box_tag "registration[event_ids][]", event.id, event.registrations.include?(@registration), id: "registration_event_ids_#{event.id}"
%label{ for: "registration_event_ids_#{event.id}" }
%h3{ style: 'margin: 0 auto;' }
= hidden_field_tag 'registration[event_ids][]', nil
= check_box_tag 'registration[event_ids][]', event.id, event.registrations.include?(registration), id: "registration_event_ids_#{event.id}"
= event.title
%small
= event.subtitle
.text-muted
= registered_text(event)
- if event.scheduled?
(Scheduled on: #{event.time.to_date})
.panel-body
-# %p
-# = canceled_replacement_event_label(event, event_schedule)
-# = replacement_event_notice(event_schedule)
-#
%p
= canceled_replacement_event_label(event, event_schedule)
= replacement_event_notice(event_schedule)
%p
- if event.speakers.any?
presented by #{event.speaker_names}
- if event_schedule.present?
.h4.track
%span.fa.fa-clock-o
%span.label{ style: "background-color: grey" }
%span.label{ style: 'background-color: grey' }
= event_schedule.start_time.strftime('%A, %B %-d %H:%M')
\-
= event_schedule.end_time.strftime('%H:%M')
%p
= markdown(truncate(event.abstract, length: 250))
-# TODO: More informative text or aria-label.
= link_to 'more', conference_program_proposal_path(@conference.short_title, event.id), target: '_blank'
= link_to 'more', conference_program_proposal_path(conference.short_title, event.id), target: '_blank'
- if event.track
%span.track
%span.fa.fa-road
%span.label{ style: "background-color: #{event.track.color}; color: #{ contrast_color(event.track.color) }" }
%span.label{ style: "background-color: #{event.track.color}; color: #{contrast_color(event.track.color)}" }
= event.track.name

View file

@ -18,6 +18,6 @@
You are registered for #{pluralize(@registration.events.count, 'event')}.
They are at the end of this list.
- @registration.events_ordered.each do |event|
= render 'conference_registrations/event', event: event, event_schedule: event.event_schedules.first
= render 'conference_registrations/event', event: event, event_schedule: event.event_schedules.first, conference: @conference, registration: @registration
= render 'conferences/code_of_conduct', organization: @conference.organization

View file

@ -9,9 +9,9 @@
-if @conference.venue
at
%strong
= "#{@conference.venue.name},"
= "#{@conference.venue.street},"
= "#{@conference.venue.city} / #{@conference.venue.country_name}."
= "#{@conference.venue_name},"
= "#{@conference.venue_street},"
= "#{@conference.city} / #{@conference.country_name}."
%small
= date_string(@conference.start_date, @conference.end_date)
- unless @conference.code_of_conduct.blank?

View file

@ -12,7 +12,7 @@
= date_string(conference.start_date, conference.end_date)
- if conference.venue
%p
= "#{conference.venue.city}/#{conference.venue.country_name}"
= "#{conference.city}/#{conference.country_name}"
- unless conference.description.blank?
%p
= markdown(conference.description, escape_html=false)

View file

@ -1,14 +1,15 @@
-# .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');
}
});
});

View file

@ -2,13 +2,14 @@
#banner{ style: ("background-image: url(#{conference.picture_url})" if conference.picture_url) }
.container
.row
.col-md-6.col-md-offset-3{id: (conference.picture? ? "header-image" : "header-no-image")}
.col-md-6.col-md-offset-3{ id: (conference.picture? ? "header-image" : "header-no-image") }
.row
-# - if conference.picture?
-# .col-md-4
-# = image_tag(conference.picture_url,
-# class: 'img-responsive img-center',
-# id: 'splash-logo')
-#
- if conference.picture?
.col-md-4
= image_tag(conference.picture_url,
class: 'img-responsive img-center',
id: 'splash-logo')
.col-md-8
%h1
= conference.title.html_safe

View file

@ -2,7 +2,7 @@
%li
%a.smoothscroll{ href: '#program' } Program
%li
= link_to('Schedule', events_conference_schedule_path(@conference))
= link_to('Schedule', events_conference_schedule_path(conference))
- cache [conference, highlights, tracks, booths, '#splash#program'] do
%section#program

View file

@ -27,7 +27,7 @@
.row
.col-md-12
%h3.text-center
= "Interested in sponsoring #{conference.title}?"
Interested in sponsoring #{conference.title}?
= link_to(sponsorship_mailto(conference)) do
Please, contact us!
.trapezoid

View file

@ -22,6 +22,6 @@
.word_break
= short_ticket_description(ticket)
%button.btn-block.btn.btn-lg.btn-success
%i.fa.fa-ticket.fa-fw{"aria-hidden": true}
%i.fa.fa-ticket.fa-fw{ "aria-hidden": true }
= humanized_money_with_symbol(ticket.price)
.trapezoid

View file

@ -18,8 +18,11 @@
#antiquated
- @antiquated.each do |conference|
= render '/conferences/conference_details', conference: conference
- if @antiquated.empty? && @current.empty? && User.empty?
= render partial: 'new_install'
%p
Add the events to your calendar:
%span.btn-group
= link_to("Days only", calendar_url(protocol: 'webcal', format: 'ics'), class: 'btn btn-default')
= link_to("Detailed", calendar_url(protocol: 'webcal', format: 'ics', full: true), class: 'btn btn-default')
-content_for :script_body do
:javascript

View file

@ -17,5 +17,5 @@
will the be administrator of it.
%p
We hope you enjoy using OSEM, if you have any question don't hesitate to
= link_to('http://osem.io/#contact') do
= link_to('https://osem.io/#contact') do
contact us!

View file

@ -20,24 +20,22 @@
- if @unpaid_tickets
.row
.col-md-12
.alert.alert-dismissable.alert-info.text-center#unpaid-tickets{role: 'alert'}
%button.button.close{"data-dismiss" => "alert", "aria-label"=>"close"}
.alert.alert-dismissable.alert-info.text-center#unpaid-tickets{ role: 'alert' }
%button.button.close{ "data-dismiss" => "alert", "aria-label"=>"close" }
&times;
%p
You have unpaid tickets. Please complete your purchase.
= link_to('Purchase Tickets', new_conference_payment_path(@conference), class: 'btn btn-success btn-lg')
- if @user_needs_to_register
.row
.col-md-12
.alert.alert-dismissable.alert-warning.text-center#flash{role: 'alert'}
%button.button.close{"data-dismiss" => "alert", 'aria-label': 'close'}
&times;
%p
You still need to complete your registration for #{@conference.title}.
= link_to('Complete Registration', new_conference_conference_registration_path(@conference), class: 'btn btn-success btn-lg')
.col-md-12
.alert.alert-dismissable.alert-warning.text-center#flash{ role: 'alert' }
%button.button.close{ "data-dismiss" => "alert", 'aria-label': 'close' }
&times;
%p
You still need to complete your registration for #{@conference.title}.
= link_to('Complete Registration', new_conference_conference_registration_path(@conference), class: 'btn btn-success btn-lg')
#splash
- if @conference.code_of_conduct.present?
@ -79,29 +77,8 @@
sponsorship_levels: @sponsorship_levels,
sponsors: @sponsors
-# footer
- if @conference.splashpage.include_social_media
- 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();
-# 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 + ')');
-# });
-# });

View file

@ -11,7 +11,7 @@
= f.input :password
- if devise_mapping.rememberable?
%p.text-right.small
= f.label 'Remember me'
= f.label 'Remember me', for: 'user_remember_me'
= f.check_box :remember_me
%p.text-right
= f.action :submit, as: :button, label: 'Sign In', button_html: {class: 'btn btn-success'}

View file

@ -0,0 +1,12 @@
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<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 "mailbot" %>
</head>
<body>
<div id="border" style="background-color: <%= conference_color(@conference) %>"></div>
</body>
</html>

View file

@ -0,0 +1,25 @@
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<title>
<%= 'Email' %>
</title>
<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 "mailbot" %>
</head>
<body>
<div id="border" style="background-color: <%= conference_color(@conference) %>">
<div class="row">
<div class="col-md-2">
<% if @conference.present? %>
<%= image_tag(conference_logo_url(@conference), style: "display:block;height:70px;width:auto;", alt: @conference.title + ' logo') %>
<% end %>
</div>
</div>
</div>
</body>

View file

@ -51,37 +51,38 @@
= 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"}
-# Need Help?
-# #navbar-devise-help.collapse
-# = render 'devise/shared/links'
-#
%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"}
Need Help?
#navbar-devise-help.collapse
= render 'devise/shared/links'
.trapezoid

View file

@ -23,8 +23,8 @@
%li
= link_to(conference_conference_registration_path(@conference)) do
%span.fa.fa-id-badge
= @conference.short_title
registration
= @conference.short_title
registration
-if @conference && @conference.program
%li
= link_to(conference_program_proposals_path(@conference.short_title)) do

View file

@ -0,0 +1,16 @@
<%= render partial: "layouts/mailbot_header" %>
<div id="content">
<span style="white-space: pre-line">
Dear <%= @user.name %>,
User <%= @comment.user.name %> posted a new comment for event <%= @event.title %> of <%= @conference.short_title %> .
"<%= @comment.body %>"
To reply to this comment, please go to <%= h(admin_conference_program_event_url(@conference.short_title, @event, only_path: false)) %>
Best wishes,
<%= @conference.title %> Team
</span>
</div>
<%= render partial: "layouts/mailbot_footer" %>

View file

@ -1,83 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- CSS -->
<link rel="stylesheet" href="main.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800" rel="stylesheet">
<style>
html {
scroll-behavior: smooth;
}
body {
background: #fff;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.06);
color: #000;
font-family: 'Montserrat', sans-serif;
font-size: 16px;
line-height: 1.5;
margin: 0 auto;
}
h1,
h3,
h4,
h5,
h6 {
font-weight: 400;
line-height: 1.3;
}
p {
color: #0B3559;
font-weight: 400;
line-height: 2;
}
#border {
background-color: #0B3559;
padding: 25px;
color:#fff;
}
#content {
background-color: #fff;
padding: 100px;
color: #0B3559;
}
</style>
<!-- Page Title -->
<title>Email</title>
</head>
<body>
<div id="border">
<div class="row">
<!-- Uncomment below to get logo -->
<div class="col-md-2">
</div>
<div class="col-md-10"><h1></h1></div>
</div>
</div>
<div id="content">
<span style="white-space: pre-line">
Dear <%= @user.name %>,
User <%= @comment.user.name %> posted a new comment for event <%= @event.title %> of <%= @conference.short_title %> .
"<%= @comment.body %>"
To reply to this comment, please go to <%= h(admin_conference_program_event_url(@conference.short_title, @event, only_path: false)) %>
Best wishes,
<%= @conference.title %> Team
</span>
</div>
<div id="border">
<h1></h1>
</div>
</body>
</html>

View file

@ -1,77 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- CSS -->
<link rel="stylesheet" href="main.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800" rel="stylesheet">
<style>
html {
scroll-behavior: smooth;
}
body {
background: #fff;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.06);
color: #000;
font-family: 'Montserrat', sans-serif;
font-size: 16px;
line-height: 1.5;
margin: 0 auto;
}
h1,
h3,
h4,
h5,
h6 {
font-weight: 400;
line-height: 1.3;
}
p {
color: #0B3559;
font-weight: 400;
line-height: 2;
}
#border {
background-color: #0B3559;
padding: 25px;
color:#fff;
}
#content {
background-color: #fff;
padding: 100px;
color: #0B3559;
}
</style>
<!-- Page Title -->
<title>Email</title>
</head>
<body>
<div id="border">
<div class="row">
<!-- Uncomment below to get logo -->
<div class="col-md-2">
<% if !@logo.nil? %>
<%= image_tag(@logo, style: "display:block") %>
<% end %>
</div>
<div class="col-md-10"><h1></h1></div>
</div>
</div>
<div id="content">
<span style="white-space: pre-line">
<%= @email_body %>
</span>
</div>
<div id="border">
<h1></h1>
</div>
</body>
</html>

View file

@ -0,0 +1,7 @@
<%= render partial: "layouts/mailbot_header" %>
<div id="content">
<span style="white-space: pre-line">
<%= @email_body %>
</span>
</div>
<%= render partial: "layouts/mailbot_footer" %>

View file

@ -0,0 +1,14 @@
<%= render partial: "layouts/mailbot_header" %>
<div id="content">
<span style="white-space: pre-line">
Dear <%= @user.name %>,
Thanks! You have successfully booked <%= @ticket_purchase.quantity %> <%= @ticket_purchase.ticket.title %> ticket(s) for the event <%= @conference.title %>. Your transaction id is <%= @ticket_purchase.id %>.
Please, find the ticket(s) pdf attached.
Best wishes,
<%= @conference.title %> Team
</span>
</div>
<%= render partial: "layouts/mailbot_footer" %>

View file

@ -1,81 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- CSS -->
<link rel="stylesheet" href="main.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800" rel="stylesheet">
<style>
html {
scroll-behavior: smooth;
}
body {
background: #fff;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.06);
color: #000;
font-family: 'Montserrat', sans-serif;
font-size: 16px;
line-height: 1.5;
margin: 0 auto;
}
h1,
h3,
h4,
h5,
h6 {
font-weight: 400;
line-height: 1.3;
}
p {
color: #0B3559;
font-weight: 400;
line-height: 2;
}
#border {
background-color: #0B3559;
padding: 25px;
color:#fff;
}
#content {
background-color: #fff;
padding: 100px;
color: #0B3559;
}
</style>
<!-- Page Title -->
<title>Email</title>
</head>
<body>
<div id="border">
<div class="row">
<!-- Uncomment below to get logo -->
<div class="col-md-2">
</div>
<div class="col-md-10"><h1></h1></div>
</div>
</div>
<div id="content">
<span style="white-space: pre-line">
Dear <%= @user.name %>,
Thanks! You have successfully booked <%= @ticket_purchase.quantity %> <%= @ticket_purchase.ticket.title %> ticket(s) for the event <%= @conference.title %>. Your transaction id is <%= @ticket_purchase.id %>.
Please, find the ticket(s) pdf attached.
Best wishes,
<%= @conference.title %> Team
</span>
</div>
<div id="border">
<h1></h1>
</div>
</body>
</html>

View file

@ -0,0 +1,16 @@
<%= render partial: "layouts/mailbot_header" %>
<div id="content">
<span style="white-space: pre-line">
Dear <%= @user.name %>,
Thanks! You have successfully booked <%= @ticket_purchase.quantity %> <%= @ticket_purchase.ticket.title %> ticket(s) for the event <%= @conference.title %>. Your transaction id is <%= @ticket_purchase.id %>.
Please, find the ticket(s) pdf attached.
The SAP Young Thinkers team will reach out to you with information on how to participate in the event soon. In the meantime, you can check the event page (https://events.sap.com/yt-learning-festival-at-snapcon-2020/en/home) or send an email with your questions to youngthinkers@sap.com.
Best wishes,
<%= @conference.title %> Team
</span>
</div>
<%= render partial: "layouts/mailbot_footer" %>

View file

@ -1,83 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- CSS -->
<link rel="stylesheet" href="main.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800" rel="stylesheet">
<style>
html {
scroll-behavior: smooth;
}
body {
background: #fff;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.06);
color: #000;
font-family: 'Montserrat', sans-serif;
font-size: 16px;
line-height: 1.5;
margin: 0 auto;
}
h1,
h3,
h4,
h5,
h6 {
font-weight: 400;
line-height: 1.3;
}
p {
color: #0B3559;
font-weight: 400;
line-height: 2;
}
#border {
background-color: #0B3559;
padding: 25px;
color:#fff;
}
#content {
background-color: #fff;
padding: 100px;
color: #0B3559;
}
</style>
<!-- Page Title -->
<title>Email</title>
</head>
<body>
<div id="border">
<div class="row">
<!-- Uncomment below to get logo -->
<div class="col-md-2">
</div>
<div class="col-md-10"><h1></h1></div>
</div>
</div>
<div id="content">
<span style="white-space: pre-line">
Dear <%= @user.name %>,
Thanks! You have successfully booked <%= @ticket_purchase.quantity %> <%= @ticket_purchase.ticket.title %> ticket(s) for the event <%= @conference.title %>. Your transaction id is <%= @ticket_purchase.id %>.
Please, find the ticket(s) pdf attached.
The SAP Young Thinkers team will reach out to you with information on how to participate in the event soon. In the meantime, you can check the event page (https://events.sap.com/yt-learning-festival-at-snapcon-2020/en/home) or send an email with your questions to youngthinkers@sap.com.
Best wishes,
<%= @conference.title %> Team
</span>
</div>
<div id="border">
<h1></h1>
</div>
</body>
</html>

View file

@ -19,7 +19,7 @@
%td
= humanized_money_with_symbol ticket.quantity * ticket.price
= form_tag conference_payments_path do
= form_tag conference_payments_path(@conference.short_title, :has_registration_ticket => @has_registration_ticket) do
%script.stripe-button{'src': "https://checkout.stripe.com/checkout.js",
'data': {amount: @total_amount_to_pay.cents,
label: "Pay #{humanized_money_with_symbol @total_amount_to_pay}",

View file

@ -12,7 +12,7 @@
-# TODO: And if they have a registration ticket?
- if !@conference.user_registered?(@user) && @has_registration_ticket
.col-md-12
.alert.alert-success{role: 'alert'}
.alert.alert-success{ role: 'alert' }
= link_to 'Complete Registration',
new_conference_conference_registration_path(@conference),
class: 'btn btn-info pull-right btn-lg'

View file

@ -9,9 +9,9 @@
- if @conference.venue
at
%strong
#{@conference.venue.name},
#{@conference.venue.street},
#{@conference.venue.city} / #{@conference.venue.country_name}.
#{@conference.venue_name},
#{@conference.venue_street},
#{@conference.city} / #{@conference.country_name}.
%small
= date_string(@conference.start_date, @conference.end_date)
.row

View file

@ -16,7 +16,8 @@
That means you have
%b.notranslate= pluralize(@program.cfp.remaining_days, 'day')
left!
%span.notranslate #{@conference.title}
will only be as good as the content you present. Submit early, submit often!
%span.notranslate= @conference.title
will only be as good as the content you present.
%br Submit early, submit often!
- else
The submission period is closed now.

View file

@ -11,83 +11,49 @@
= track_selector_input f
= f.input :event_type_id, as: :select,
collection: @conference.program.event_types.map {|type| ["#{type.title} - #{show_time(type.length)}", type.id,
data: { min_words: type.minimum_abstract_length, max_words: type.maximum_abstract_length, help: type.description }]},
include_blank: false, label: 'Type', input_html: { class: 'select-help-toggle' }
- if @program.languages.present?
= f.input :language, as: :select,
collection: @languages,
include_blank: false, label: 'Language', input_html: { class: 'select-help-toggle' }
- @conference.program.event_types.each do |event_type|
%span{ class: 'help-block select-help-text event_event_type_id collapse', id: "#{event_type.id}-help" }
= event_type.description
- if @program.difficulty_levels.present?
= f.input :difficulty_level, as: :select, collection: @program.difficulty_levels,
input_html: { class: 'select-help-toggle' },
include_blank: '(Please select)' if @conference.program.difficulty_levels.any?
= f.input :difficulty_level, as: :select, collection: @conference.program.difficulty_levels, input_html: { class: 'select-help-toggle' },
include_blank: '(Please select)' if @conference.program.difficulty_levels.any?
- @program.difficulty_levels.each do |difficulty_level|
%span{ class: 'help-block select-help-text collapse event_difficulty_level_id', id: "#{difficulty_level.id}-help" }
= difficulty_level.description
- @conference.program.difficulty_levels.each do |difficulty_level|
%span{ class: 'help-block select-help-text collapse event_difficulty_level_id', id: "#{difficulty_level.id}-help" }
= difficulty_level.description
= f.input :abstract, required: true, input_html: { rows: 5, data: { provide: 'markdown' } },
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)')
%p
You have used
%span#abstract-count #{@event.abstract_word_count}
words. Abstracts must be between
%span#abstract-minimum-word-count
0
and
%span#abstract-maximum-word-count
250
words.
%br
= f.input :submission_text, input_html: { rows: 5, data: { provide: 'markdown' }, placeholder: '' },
hint: markdown_hint('Only conference organizers will read this.')
%p
You have used
%span#submission-count #{@event.submission_word_count}
words. Submission descriptions must be between
%span#submission-minimum-word-count
0
and
%span#submission-maximum-word-count
250
words.
= render 'proposals/submission_type_content_form', f: f, program: @program
-# TODO-SNAPCON: Extract this to be a `conference_committee_role?`
- if current_user.has_any_role? :admin, { name: :organizer, resource: @conference }, { name: :cfp, resource: @conference }
%br
= f.input :committee_review, input_html: { rows: 5, data: { provide: 'markdown' }, placeholder: '' },
hint: markdown_hint('This field is shared with the submission authors.')
= f.input :committee_review, input_html: { rows: 5, data: { provide: 'markdown' } },
hint: markdown_hint('This field is shared with the submission authors.')
- if current_user.is_admin? or @program.cfp.enable_registrations?
- if @program.cfp&.enable_registrations?
= f.inputs 'Enable pre-registration' do
= f.input :require_registration, label: 'Require participants to register to your event'
- message = @event.room ? "Value must be between 1 and #{@event.room.size}" : 'Check room capacity after scheduling.'
= f.input :max_attendees, hint: 'The maximum number of participants. ' + message
- if current_user.has_any_role? :admin, { name: :organizer, resource: @conference }, { name: :cfp, resource: @conference }
= f.input :is_highlight
%p.text-right
= link_to '#description', 'data-toggle' => 'collapse' do
Do you require something special?
#description{ class: "collapse #{ 'in' if @event.description.present? }" }
= f.input :description, input_html: { rows: 5 }, label: 'Requirements', placeholder: 'Eg. Whiteboard, printer, or something like that.'
- if current_user.has_any_role? :admin, { name: :organizer, resource: @conference }, { name: :cfp, resource: @conference }
%p (Admin Only)
= f.input :is_highlight
%p.text-right
- if @event.new_record?
= f.submit 'Submit Proposal', class: 'btn btn-success'
- else
= f.submit 'Update Proposal', class: 'btn btn-success'
= f.submit 'Update Proposal', class: 'btn btn-primary'
:javascript
$(document).ready(function() {

View file

@ -1,13 +1,13 @@
.speakerinfo
.row
.col-md-4
= image_tag speaker.profile_picture(:size => 120), class: 'img-responsive img-rounded'
= image_tag speaker.profile_picture(size: 120), class: 'img-responsive img-rounded'
.col-md-8
%h4
= link_to speaker.name, user_path(speaker.id)
%br
- if speaker.email_public?
= mail_to "#{ speaker.email }" do
= mail_to speaker.email.to_s do
%i.fa.fa-envelope-o.fa-2x
- if speaker.affiliation?
.text-muted

View file

@ -0,0 +1,68 @@
-# PARTIAL FOR EVENT/PROPOSAL FORM
= f.input :event_type_id, as: :select, include_blank: false, label: 'Type',
input_html: { class: 'select-help-toggle' },
collection: event_type_options(program.event_types)
- program.event_types.each do |event_type|
.help-block.event_event_type_id.collapse{ id: "#{event_type.id}-help" }
%strong Description
%div
= markdown(event_type.description)
%h3 Submission Abstract
%p
The abstract is reviewed by the committee and included in the conference program.
You are encouraged to include links or other references as appropriate.
= f.label :abstract, class: 'sr-only'
= f.input :abstract, required: true, label: false,
input_html: { rows: 5, data: { provide: 'markdown' } },
hint: markdown_hint
%p
You have used
%span#abstract-count 0
words. Abstracts must be between
%span#abstract-minimum-word-count 0
and
%span#abstract-maximum-word-count 250
words.
%hr
%h3 Submission Details
%p
This part of the submission is intended only for the conference committee.
- program.event_types.each do |event_type|
.help-block.select-help-text.event_event_type_id.collapse{ id: "#{event_type.id}-instructions" }
- if event_type.submission_instructions.blank?
%p
Use this space to include any additional inforrmation that is helpful in reviewing your
submission. If you have any co-presenters, please include them
below. After submission, you will have the opportunity to add them to the
speakers list. (However, they must have an active #{ENV['OSEM_NAME']} account.)
- else
%p
Please use the following as the template for your submission. This will help the conference
committee review your submission with all the details they need. If you have any
co-presenters, please include them below. After submission, you will have the opportunity
to add them to the speakers list. (However, they must have an active #{ENV['OSEM_NAME']}
account.)
.panel.panel-primary
.panel-heading
= event_type.name
Template
.panel-body
= markdown(event_type.submission_instructions)
.panel-footer
%button.btn.btn-warning.btn-xs.js-resetSubmissionText{ type: 'button',
data: { confirm: 'Do you really want to reset your submission text to the provided template?' } }
Reset Submission to Template
%span.small You may want to use this if you have changed the submission type.
= f.label :submission_text, class: 'sr-only'
= f.input :submission_text, label: false,
input_html: { rows: 10, data: { provide: 'markdown' } },
hint: markdown_hint

View file

@ -1,30 +1,31 @@
- progress_status = event.progress_status
%ul.list-unstyled
- if can? :create, @conference.registrations.new
%li{'class'=>class_for_todo(progress_status['registered'])}
%span{'class'=>icon_for_todo(progress_status['registered'])}
- if progress_status['registered']
%li{class: class_for_todo(progress_status[:registered])}
%span{class: icon_for_todo(progress_status[:registered])}
- if progress_status[:registered]
Speaker(s) registered to the conference
- else
= link_to 'Speaker(s) not registered to the conference', new_conference_conference_registration_path(event.program.conference.short_title)
%li{'class'=>class_for_todo(progress_status['biographies'])}
%span{'class'=>icon_for_todo(progress_status['biographies'])}
- if progress_status['biographies']
%li{class: class_for_todo(progress_status[:biographies])}
%span{class: icon_for_todo(progress_status[:biographies])}
- if progress_status[:biographies]
Speakers have filled out their biographies
- elsif current_user.biography.blank? && event.speakers.include?(current_user)
= link_to 'Fill out your biography', edit_user_path(current_user)
- else
Speakers' biographies missing
%li{'class'=>class_for_todo(progress_status['subtitle'])}
%span{'class'=>icon_for_todo(progress_status['subtitle'])}
%li{class: class_for_todo(progress_status[:subtitle])}
%span{class: icon_for_todo(progress_status[:subtitle])}
= 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'])}
%li{class: class_for_todo(progress_status[:commercials])}
%span{class: icon_for_todo(progress_status[:commercials])}
= 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'])}
- unless progress_status[:track].nil?
%li{class: class_for_todo(progress_status[:track])}
%span{class: icon_for_todo(progress_status[:track])}
= link_to 'Add a track', edit_conference_program_proposal_path(event.program.conference.short_title, event)
%li{'class'=>class_for_todo(progress_status['difficulty_level'])}
%span{'class'=>icon_for_todo(progress_status['difficulty_level'])}
= link_to 'Add a difficulty level', edit_conference_program_proposal_path(event.program.conference.short_title, event)
- unless progress_status[:difficulty_level].nil?
%li{class: class_for_todo(progress_status[:difficulty_level])}
%span{class: icon_for_todo(progress_status[:difficulty_level])}
= link_to 'Add a difficulty level', edit_conference_program_proposal_path(event.program.conference.short_title, event)

View file

@ -1,7 +1,7 @@
.speakerinfo
.row
.col-md-4
= image_tag speaker.profile_picture(:size => 120), class: 'img-responsive img-rounded'
= image_tag speaker.profile_picture(size: 120), class: 'img-responsive img-rounded'
.col-md-8
%h4
= link_to speaker.name, user_path(speaker.id)

View file

@ -1,8 +1,8 @@
%table.table.table-striped#events
- events.each do |event|
%tr
%td.col-md-7{style: "padding:20px 8px 20px 8px;"}
= link_to event.title, conference_program_proposal_path(@conference.short_title, event.id)
%td.col-md-7{ style: 'padding:20px 8px 20px 8px;' }
= link_to event.title, conference_program_proposal_path(conference.short_title, event.id)
%br
%small.text-muted
= event.event_type.title
@ -10,10 +10,11 @@
= "in #{event.track.name}" if event.track
- if event.require_registration
%br
= link_to registered_text(event), registrations_conference_program_proposal_path(@conference.short_title, event), class: 'btn btn-xs btn-danger'
= link_to registered_text(event), registrations_conference_program_proposal_path(conference.short_title, event),
class: 'btn btn-xs btn-danger'
%td.col-md-2{style: "padding:20px 8px 20px 8px;"}
- event_schedule = event.event_schedules.find_by(schedule_id: @program.selected_schedule_id)
%td.col-md-2{ style: 'padding:20px 8px 20px 8px;' }
- event_schedule = event.event_schedules.find_by(schedule_id: program.selected_schedule_id)
- if event_schedule.present?
= inyourtz(event_schedule.start_time, @conference.timezone) do
= event_schedule.start_time.strftime("%Y %B %e - %H:%M")
= inyourtz(event_schedule.start_time, conference.timezone) do
= event_schedule.start_time.strftime('%Y %B %e - %H:%M')

View file

@ -121,7 +121,7 @@
Volunteer Duties
%small
Thanks for being a host at #{@conference.title}
= render 'volunteers_table', events: @volunteer_events
= render 'volunteers_table', events: @volunteer_events, conference: @conference, program: @program
.row
.col-md-12

View file

@ -5,6 +5,7 @@
%h1 New #{@conference.title} Proposal
- if @program.cfp_open?
- if @program.cfp.description.present?
%h2 Call for Proposals
.row
.col-md-12
= markdown(@program.cfp.description, escape_html=false)
@ -31,51 +32,22 @@
= f.inputs name: 'Proposal Information' do
= f.input :title, as: :string, required: true, input_html: { required: true }
= f.input :event_type_id, as: :select,
collection: @program.event_types.map {|type| ["#{type.title} - #{show_time(type.length)}", type.id,
data: { min_words: type.minimum_abstract_length, max_words: type.maximum_abstract_length }]},
include_blank: false, label: 'Type', input_html: { class: 'select-help-toggle' }
- @program.event_types.each do |event_type|
%div{ class: 'help-block event_event_type_id collapse', id: "#{event_type.id}-help"}
%strong Directions
%div
= markdown(event_type.description)
- if @program.languages.present?
= f.input :language, as: :select,
collection: @languages,
include_blank: false, label: 'Language', input_html: { class: 'select-help-toggle' }
= f.input :abstract, required: true, input_html: { rows: 5, data: { provide: 'markdown' } },
hint: markdown_hint
%p
You have used
%span#abstract-count #{@event.abstract_word_count}
words. Abstracts must be between
%span#abstract-minimum-word-count
0
and
%span#abstract-maximum-word-count
250
words.
= f.input :submission_text, input_html: { rows: 5, data: { provide: 'markdown' } },
hint: markdown_hint
%p
You have used
%span#submission-count #{@event.submission_word_count}
words. Submission descriptions must be between
%span#submission-minimum-word-count
0
and
%span#submission-maximum-word-count
250
words.
- if @program.difficulty_levels.present?
= f.input :difficulty_level, as: :select, collection: @program.difficulty_levels,
input_html: { class: 'select-help-toggle' },
include_blank: '(Please select)' if @conference.program.difficulty_levels.any?
- @program.difficulty_levels.each do |difficulty_level|
%span.help-block.select-help-text.collapse.event_difficulty_level_id{ id: "#{difficulty_level.id}-help" }
= difficulty_level.description
= render 'submission_type_content_form', f: f, program: @program
- if @program.cfp.enable_registrations?
= f.input :require_registration, label: 'Require participants to register to your event'
@ -88,7 +60,7 @@
= f.input :description, input_html: { rows: 5 }, label: 'Requirements', placeholder: 'Eg. Whiteboard, printer, or something like that.'
%p.text-right
= f.submit 'Submit Proposal', class: 'btn btn-success'
= f.submit 'Submit Proposal', class: 'btn btn-success btn-lg'
.tab-pane{role: 'tabpanel', id: 'signin'}
= render partial: 'devise/shared/sign_in_form_embedded'

View file

@ -1,20 +1,20 @@
.panel.panel-default.event-panel{ onClick: 'eventClicked(event, this);', "data-url" => "#{url_for(conference_program_proposal_path(@conference.short_title, event.id))}" }
.panel.panel-default.event-panel{ onClick: 'eventClicked(event, this);', 'data-url' => "#{url_for(conference_program_proposal_path(@conference.short_title, event.id))}" }
- header_color = event.event_type&.color || '#f5f5f5'
.trapezoid{style: "color: white; top: 12px; z-index: 100;"}
.trapezoid{ style: 'color: white; top: 12px; z-index: 100;' }
.panel-heading{ style: "background-color: #{header_color}; color: #{ contrast_color(header_color) }; border-radius: 4px" }
- event.speakers_ordered.each do |speaker|
= image_tag speaker.profile_picture, class: "img-circle pull-right", alt: speaker.name, style: "padding: 2px;"
= image_tag speaker.profile_picture, class: 'img-circle pull-right', alt: speaker.name, style: 'padding: 2px;'
%p
= canceled_replacement_event_label(event, event_schedule)
= replacement_event_notice(event_schedule)
%span.h3{style: "margin-bottom: 14px"}
%span.h3{ style: 'margin-bottom: 14px' }
= event.title
%br
%small{style: "color: #{contrast_color(header_color)}"}
%small{ style: "color: #{contrast_color(header_color)}" }
= event.subtitle
.trapezoid{style: "color: #{header_color}; top: 12px;"}
.trapezoid{ style: "color: #{header_color}; top: 12px;" }
.panel-body
%h4
@ -30,13 +30,13 @@
= inyourtz(event_schedule.start_time) do
%span.track
%span.fa.fa-clock-o
%span.label{ style: "background-color: grey" }
%span.label{ style: 'background-color: grey' }
= event_schedule.start_time.strftime('%l:%M %P')
\-
= event_schedule.end_time.strftime('%l:%M %P')
%span.track
%span.fa.fa-map-marker
%span.label{ style: "background-color: grey" }
%span.label{ style: 'background-color: grey' }
= event_schedule.room.name
- if event.track
%span.track

View file

@ -9,26 +9,30 @@
.col-md-12
%h2
#{pluralize(@events_schedules.count, 'Event')} Occurring Within The Next 30 minutes.
%h3
This page was loaded at
= inyourtz(Time.now) do
#{Time.now.strftime('%a %b %d at %I:%M %P (%z)')}
%br
%small
This page was loaded at
= inyourtz(Time.now) do
= Time.now.strftime('%a %b %d at %I:%M %P (%z)')
\.
.row
/ TODO: Clean this up, merge with all events page.
/ scheduled events
- date = nil
- time = nil
- @events_schedules.each do |event_schedule|
- unless event_schedule.start_time.strftime('%Y-%m-%d').eql?(date)
.col-xs-12.col-md-12
.date-content
%span{ class: 'date-title', id: "#{ event_schedule.start_time.strftime('%Y-%m-%d') }" }
%span.date-title{ id: event_schedule.start_time.strftime('%Y-%m-%d').to_s }
= inyourtz(event_schedule.start_time, @conference.timezone) do
= date = event_schedule.start_time.strftime('%Y-%m-%d')
%a{ title: "Go up", class: "pull-right", href: "#program" }
%i{ class: "fa fa-angle-double-up fa-lg", 'aria-hidden' => true }
- unless event_schedule.start_time.strftime('%H:%M').eql?(time)
%a.pull-right{ title: 'Go up', href: '#program' }
%i.fa.fa-angle-double-up.fa-lg{ 'aria-hidden' => true }
- if event_schedule.start_time.strftime('%H:%M').eql?(time)
.col-xs-12.col-md-11.col-md-offset-1
= render 'event', event: event_schedule.event, event_schedule: event_schedule
- else
.col-xs-12.col-md-1
.start-time
= inyourtz(event_schedule.start_time, @conference.timezone) do
@ -36,9 +40,6 @@
.col-xs-12.col-md-11
.new-time-event
= render 'event', event: event_schedule.event, event_schedule: event_schedule
- else
.col-xs-12.col-md-11.col-md-offset-1
= render 'event', event: event_schedule.event, event_schedule: event_schedule
:javascript
// Refresh the page every 5 minutes.

View file

@ -26,9 +26,13 @@
.visible-md-inline.visible-lg-inline
= render partial: 'carousel', locals: { date: date, hrs_per_slide: 3 }
%p.pull-right
= link_to app_conference_schedule_path do
Get the mobile app!
%p
%span
= link_to conference_schedule_url(protocol: 'webcal', format: 'ics') do
Add the schedule to your calendar
%span.pull-right
= link_to app_conference_schedule_path do
Get the mobile app!
:javascript
// change of active tab and the button title when a date is clicked