Merge branch 'master' into admin-ticketing

* master: (61 commits)
  Replace more Commercials with Materials
  Rename more commericals to materials
  UI -- Repalce "Commerials" with "Materials".
  Re-order Conference Associations
  Cleanup CSS add Snap! style block attachments
  hide venue link if there is no venue link
  No dropshadow
  Text with drop shadow for now
  Tidy up the look of lodging panels
  Show reg status for tickets.
  Tweak CSS, fix loding order
  Move the venue description to below the map.
  Update lodging styling. Add description for venu when map is shown.
  CSS tweaks...
  Make the edit form not so wide.
  Support markdown in more fields
  Cleanup CSS ordering, fix coloring for navdropdowns
  dumb...fix order of link_to args
  ARRRGHHH, another typo...same line...
  fix typo
  ...
This commit is contained in:
Michael Ball 2020-02-06 01:37:38 -08:00
commit 4306fbe636
82 changed files with 423 additions and 428 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View file

@ -13,40 +13,6 @@ $(function () {
format: 'YYYY-MM-DD HH:mm'
});
$("#registration-arrival-datepicker").datetimepicker({
useCurrent: false,
stepping: 15,
sideBySide: true,
format: "YYYY-MM-DD HH:mm",
// current_date <= arrival_date <= end_date
maxDate : $("#registration-arrival-datepicker").attr('end_date'),
minDate : today
});
$("#registration-departure-datepicker").datetimepicker({
useCurrent: false,
stepping: 15,
sideBySide: true,
format: "YYYY-MM-DD HH:mm",
// departure_date > start_date
minDate : $("#registration-arrival-datepicker").attr('start_date')
});
$("#registration-arrival-datepicker").on("dp.change",function (e) {
// departure_date > start_date,arrival_date
if ((new Date(e.date).getTime()) > (new Date($("#registration-arrival-datepicker").attr('start_date')).getTime())){
$('#registration-departure-datepicker').data("DateTimePicker").minDate(e.date);
}
else{
$('#registration-departure-datepicker').data("DateTimePicker").minDate($("#registration-arrival-datepicker").attr('start_date'));
}
});
// departure_date >= arrival_date
$("#registration-departure-datepicker").on("dp.change",function (e) {
$('#registration-arrival-datepicker').data("DateTimePicker").maxDate(e.date);
});
$("#conference-start-datepicker").datetimepicker({
useCurrent: false,
format: "YYYY-MM-DD",

View file

@ -2,6 +2,13 @@
*= require strap-on
*= require formtastic-bootstrap
*= require dataTables/bootstrap/3/jquery.dataTables.bootstrap
*= require selectize
*= require selectize.bootstrap3
*= require bootstrap-select
*= require bootstrap-markdown
*= require bootstrap-datetimepicker
*= require leaflet
*= require osem
*= require osem-rating
*= require osem-schedule
@ -10,15 +17,9 @@
*= require osem-splash
*= require font-awesome
*= require osem-fonts
*= require bootstrap-markdown
*= require bootstrap-datetimepicker
*= require leaflet
*= require bootstrap3-switch
*= require osem-payments
*= require osem-navbar
*= require selectize
*= require selectize.bootstrap3
*= require mastodon
*= require bootstrap-select
*= require conferences
*/

View file

@ -1,4 +1,6 @@
@import "breakpoints.scss";
@import "osem-variables.scss";
.nav-osem {
border: none;
@include breakpoint(xs) {
@ -29,7 +31,23 @@
}
}
.dropdown-menu {
padding: 17px;
min-width: 225px;
}
&.navbar-default {
.navbar-nav > .open > a {
&:hover, &:focus {
color: $navbar-default-link-color;
}
}
}
.navbar-brand img {
margin-top: -5px;
max-height: 100%;
}
.trapezoid {
border-top-color: $navbar-default-bg;
}
}

View file

@ -64,9 +64,8 @@
#schedule td.event {
background-image: linear-gradient(to top, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
cursor: pointer;
padding: 3px 2px;
cursor: pointer;
padding: 3px 2px;
}
#schedule td.event:hover

View file

@ -1,4 +1,5 @@
@import "breakpoints.scss";
@import "osem-variables.scss";
#splash {
// Counter the general padding for #content
@ -6,18 +7,30 @@
section {
padding-top: 60px;
padding-bottom: 60px;
.trapezoid {
top: 60px + $trapezoid-height;
}
}
section:nth-child(even) {
background: none repeat scroll 0 0 #e0e0e0;
color: #555;
background: none repeat scroll 0 0 #eee;
color: #333;
.trapezoid {
border-top-color: #eee;
}
}
section:nth-child(odd) {
background: none repeat scroll 0 0 #ffffff;
color: #7b7b7b;
color: #333;
.thumbnail {
background: none repeat scroll 0 0 #e0e0e0;
}
.trapezoid {
border-top-color: #fff;
}
}
.cta-button {
@ -32,11 +45,15 @@
padding-top: 100px;
padding-bottom: 100px;
.container {
#header {
#header-no-image {
background-color: rgba(224, 224, 224,.80);
padding-top: 20px;
padding-bottom: 20px;
}
#header-image {
color: #FFF;
}
}
}
@ -67,6 +84,10 @@
#venue-pic {
margin-top: 20px;
}
// The venue section has less padding.
.trapezoid {
top: $trapezoid-height;
}
}
#lodging {
@ -93,6 +114,14 @@
}
}
#tickets {
a {
&:hover, &:focus {
text-decoration: none;
}
}
}
#sponsors {
.img-sponsor {
max-height: 100px;
@ -116,14 +145,13 @@
}
#social-media{
background: none repeat scroll 0 0 #2f2f2f;
padding-top: 60px;
padding-bottom: 60px;
background: none repeat scroll 0 0 #0C3559;
padding: 50px 20px;
i{
color: #4a4a4a;
color: #FFF;
}
i:hover{
color: #16a085;
color: #F2E205;
}
a{
padding-left: 100px;
@ -164,11 +192,11 @@
i.fa {
line-height: inherit;
}
&.show {
visibility:visible;
cursor:pointer;
opacity: 1.0;
}
// &.show {
// visibility:visible;
// cursor:pointer;
// opacity: 1.0;
// }
a {
color: white;
}

View file

@ -0,0 +1,14 @@
// This file is included *early* in CSS order!
// These variables change bootstrap defaults.
$navbar-default-bg: #0C3559;
$navbar-default-link-active-bg: rgb(8,8,8);
$navbar-default-border: 1px solid #d4d4d4;
$navbar-default-color: #FFF;
$navbar-default-link-color: #FFF;
$navbar-default-link-hover-color: #F2E205;
$navbar-default-link-active-hover-color: #FFF;
// The hiegh of the section tabs that are like Snap! blocks.
$trapezoid-height: 14px;

View file

@ -1,3 +1,4 @@
@import "osem-variables";
@import "bootstrap/mixins";
html {
@ -7,15 +8,31 @@ html {
body {
/* Margin bottom by 2 times the footer height */
margin-bottom: 60px;
margin-bottom: 85px;
/* Margin bottom by navbar height */
padding-top: 60px;
font-size: 16px;
}
#content {
padding-bottom: 60px;
}
// Designed to be the last element in a section / nav
// Makes a little "puzzle piece" connector.
.trapezoid {
position: relative;
margin-left: 60px;
border-top: $trapezoid-height solid;
border-left: 9px solid transparent;
border-right: 9px solid transparent;
height: 0;
width: 64px;
margin-top: -1 * $trapezoid-height;
top: $trapezoid-height;
z-index: 1000;
}
#footer {
position: absolute;
bottom: 0;

View file

@ -1,10 +1,5 @@
$navbar-default-bg: #299a0b;
$navbar-default-link-active-bg: #DFE0DF;
$navbar-default-border: 1px solid #d4d4d4;
$navbar-default-color: #ffffff;
$navbar-default-link-color: #ffffff;
$navbar-default-link-hover-color: #000000;
// Place bootstrap variable customizations in the file below.
@import "osem-variables";
@import 'bootstrap-datetimepicker';
@import "bootstrap-sprockets";

View file

@ -17,10 +17,10 @@ module Admin
if @commercial.save
redirect_to admin_conference_commercials_path,
notice: 'Commercial was successfully created.'
notice: 'Materials were successfully created.'
else
redirect_to admin_conference_commercials_path,
error: 'An error prohibited this Commercial from being saved: '\
error: 'An error prohibited materials from being saved: '\
"#{@commercial.errors.full_messages.join('. ')}."
end
@ -29,17 +29,17 @@ module Admin
def update
if @commercial.update(commercial_params)
redirect_to admin_conference_commercials_path,
notice: 'Commercial was successfully updated.'
notice: 'Materials were successfully updated.'
else
redirect_to admin_conference_commercials_path,
error: 'An error prohibited this Commercial from being saved: '\
error: 'An error prohibited materials from being saved: '\
"#{@commercial.errors.full_messages.join('. ')}."
end
end
def destroy
@commercial.destroy
redirect_to admin_conference_commercials_path, notice: 'Commercial was successfully destroyed.'
redirect_to admin_conference_commercials_path, notice: 'Materials were successfully removed.'
end
def render_commercial
@ -60,9 +60,9 @@ module Admin
errors = Commercial.read_file(params[:file]) if params[:file]
if !params[:file]
flash[:error] = 'Empty file detected while adding commercials to Event'
flash[:error] = 'Empty file detected while adding materials to Event'
elsif errors.all? { |_k, v| v.blank? }
flash[:notice] = 'Successfully added commercials.'
flash[:notice] = 'Successfully added materials.'
else
errors_text = ''
errors_text << 'Unable to find event with ID: ' + errors[:no_event].join(', ') + '. ' if errors[:no_event].any?

View file

@ -82,7 +82,7 @@ module Admin
def registration_params
params.require(:registration).permit(
:user_id, :conference_id, :arrival, :departure, :attended,
:user_id, :conference_id, :attended,
:volunteer, :other_special_needs, :accepted_code_of_conduct,
vchoice_ids: [], qanswer_ids: [], qanswers_attributes: [], event_ids: []
)

View file

@ -12,10 +12,10 @@ module Admin
if @commercial.save
redirect_to admin_conference_venue_path,
notice: 'Commercial was successfully created.'
notice: 'Materials successfully created.'
else
redirect_to admin_conference_venue_path,
error: 'An error prohibited this Commercial from being saved: '\
error: 'An error prohibited materials from being saved: '\
"#{@commercial.errors.full_messages.join('. ')}."
end
@ -24,17 +24,17 @@ module Admin
def update
if @commercial.update(commercial_params)
redirect_to admin_conference_venue_path,
notice: 'Commercial was successfully updated.'
notice: 'Materials successfully updated.'
else
redirect_to admin_conference_venue_path,
error: 'An error prohibited this Commercial from being saved: '\
error: 'An error prohibited materials from being saved: '\
"#{@commercial.errors.full_messages.join('. ')}."
end
end
def destroy
@commercial.destroy
redirect_to admin_conference_venue_path, notice: 'Commercial was successfully destroyed.'
redirect_to admin_conference_venue_path, notice: 'Materials successfully destroyed.'
end
def render_commercial

View file

@ -12,27 +12,27 @@ class CommercialsController < ApplicationController
if @commercial.save
redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'),
notice: 'Commercial was successfully created.'
notice: 'Materials were successfully created.'
else
redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'),
error: "An error prohibited this Commercial from being saved: #{@commercial.errors.full_messages.join('. ')}."
error: "An error prohibited these materials from being saved: #{@commercial.errors.full_messages.join('. ')}."
end
end
def update
if @commercial.update(commercial_params)
redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'),
notice: 'Commercial was successfully updated.'
notice: 'Materials were successfully updated.'
else
redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id, anchor: 'commercials-content'),
error: "An error prohibited this Commercial from being saved: #{@commercial.errors.full_messages.join('. ')}."
error: "An error prohibited materials from being saved: #{@commercial.errors.full_messages.join('. ')}."
end
end
def destroy
@commercial.destroy
redirect_to edit_conference_program_proposal_path(conference_id: @conference.short_title, id: @event.id),
notice: 'Commercial was successfully destroyed.'
notice: 'Materials were successfully destroyed.'
end
def render_commercial

View file

@ -108,9 +108,9 @@ class ConferenceRegistrationsController < ApplicationController
end
def registration_params
params.require(:registration)
params.permit(:registration)
.permit(
:conference_id, :arrival, :departure,
:conference_id,
:volunteer, :accepted_code_of_conduct,
vchoice_ids: [], qanswer_ids: [],
qanswers_attributes: [],

View file

@ -54,7 +54,7 @@ class ConferencesController < ApplicationController
@tickets = @conference.tickets.visible.order('price_cents')
end
if splashpage.include_lodgings
@lodgings = @conference.lodgings.order('name')
@lodgings = @conference.lodgings.order('id')
end
if splashpage.include_sponsors
@sponsorship_levels = @conference.sponsorship_levels.eager_load(

View file

@ -10,8 +10,6 @@ class RegistrationDatatable < AjaxDatatablesRails::Base
roles: { source: 'Role.name' },
email: { source: 'User.email' },
accepted_code_of_conduct: { source: 'Registration.accepted_code_of_conduct', searchable: false },
arrival: { source: 'Registration.arrival', searchable: false },
departure: { source: 'Registration.departure', searchable: false },
actions: { source: 'Registration.id', searchable: false, orderable: false }
}
end
@ -36,8 +34,6 @@ class RegistrationDatatable < AjaxDatatablesRails::Base
roles: conference_role_titles(record.user),
email: record.email,
accepted_code_of_conduct: !!record.accepted_code_of_conduct, # rubocop:disable Style/DoubleNegation
arrival: record.arrival&.utc,
departure: record.departure&.utc,
questions: {},
edit_url: edit_admin_conference_registration_path(conference, record),
DT_RowId: record.id

View file

@ -40,19 +40,20 @@ class UserDatatable < AjaxDatatablesRails::Base
# rubocop:disable Naming/AccessorMethodName
def get_raw_records
User.left_outer_joins(:registrations, :roles)
.distinct
.select("users.*, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count")
.group('users.id')
User.left_outer_joins(:registrations, :roles).select(
"DISTINCT users.id, users.name, users.email, users.confirmed_at, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count"
).group(
'users.id, users.name, users.email, users.confirmed_at'
)
end
# rubocop:enable Naming/AccessorMethodName
def records_total_count
fetch_records.unscope(:group).count(:all)
fetch_records.unscoped.count(:id)
end
def records_filtered_count
filter_records(fetch_records).unscope(:group).count(:all)
filter_records(fetch_records).unscoped.count
end
# ==== These methods represent the basic operations to perform on records

View file

@ -185,7 +185,7 @@ module ApplicationHelper
'OSEM'
)
link_to(
link_text,
image_tag('snapcon_logo.png'),
root_path,
class: 'navbar-brand',
title: 'Open Source Event Manager'

View file

@ -1,4 +1,5 @@
# frozen_string_literal: true
require 'redcarpet/render_strip'
module FormatHelper
##
@ -191,9 +192,12 @@ module FormatHelper
return '' if text.nil?
options = {
autolink: true,
autolink: true,
space_after_headers: true,
no_intra_emphasis: true
tables: true,
strikethrough: true,
footnotes: true,
superscript: true
}
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new(escape_html: escape_html), options)
markdown.render(text).html_safe
@ -203,6 +207,11 @@ module FormatHelper
markdown("#{text} Please look at #{link_to '**Markdown Syntax**', 'https://daringfireball.net/projects/markdown/syntax', target: '_blank'} to format your text", false)
end
# Return a plain text markdown stripped of formatting.
def plain_text(content)
Redcarpet::Markdown.new(Redcarpet::Render::StripDown).render(content)
end
def quantity_left_of(resource)
return '-/-' if resource.quantity.blank?

View file

Binary file not shown.

View file

@ -39,7 +39,7 @@ class Commercial < ApplicationRecord
commercial = event.commercials.new(url: url)
unless commercial.save
errors[:validation_errors] << "Could not create commercial for event with ID #{event.id} (" + commercial.errors.full_messages.to_sentence + ')'
errors[:validation_errors] << "Could not create materials for event with ID #{event.id} (" + commercial.errors.full_messages.to_sentence + ')'
end
end
errors

View file

@ -25,8 +25,8 @@ class Conference < ApplicationRecord
has_one :email_settings, dependent: :destroy
has_one :program, dependent: :destroy
has_one :venue, dependent: :destroy
has_many :physical_tickets, through: :ticket_purchases
has_many :ticket_purchases, dependent: :destroy
has_many :physical_tickets, through: :ticket_purchases
has_many :payments, dependent: :destroy
has_many :supporters, through: :ticket_purchases, source: :user
has_many :tickets, dependent: :destroy

View file

@ -28,8 +28,6 @@ class Registration < ApplicationRecord
validates :user_id, uniqueness: { scope: :conference_id, message: 'already Registered!' }
validate :registration_limit_not_exceed, on: :create
validate :registration_to_events_only_if_present
validates :accepted_code_of_conduct, acceptance: {
if: -> { conference.try(:code_of_conduct).present? }
}
@ -48,19 +46,6 @@ class Registration < ApplicationRecord
private
##
# If the user registers to attend events that are already scheduled,
# only allow registration to events if the user will be present
# (based on arrival and departure attributes)
# No validation if arrival/departure attributes are empty
def registration_to_events_only_if_present
if (arrival || departure) && events.pluck(:start_time).any?
errors.add(:arrival, 'is too late! You cannot register for events that take place before your arrival') if events.pluck(:start_time).compact.map { |x| x < arrival }.any?
errors.add(:departure, 'is too early! You cannot register for events that take place after your departure') if events.pluck(:start_time).compact.map { |x| x > departure }.any?
end
end
def subscribe_to_conference
Subscription.create(conference_id: conference.id, user_id: user.id)
end

View file

@ -50,7 +50,7 @@ class User < ApplicationRecord
else
[:database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable,
:omniauthable, omniauth_providers: [:suse, :google, :facebook, :github]]
:omniauthable, omniauth_providers: [:google, :discourse]]
end
devise(*devise_modules)

View file

@ -1,11 +1,11 @@
.row
.col-md-12
.page-header
%h1 Commercials
%h1 Session Materials
%p.text-muted
Conference commercials will be displayed on the events in the
Conference materials will be displayed on the events in the
= link_to 'schedule,', conference_schedule_path(@conference.short_title)
if the event speaker didn't add an event commercial.
if the event speaker didn't add any event materials.
- if can? :create, @conference.commercials.new
.row
.col-md-6

View file

@ -7,11 +7,12 @@
Event Type
= @event_type.title
.row
.col-md-12
= semantic_form_for(@event_type, url: (@event_type.new_record? ? admin_conference_program_event_types_path : admin_conference_program_event_type_path(@conference.short_title, @event_type))) do |f|
.col-md-8
- form_url = (@event_type.new_record? ? admin_conference_program_event_types_path : admin_conference_program_event_type_path(@conference.short_title, @event_type))
= semantic_form_for(@event_type, url: form_url) do |f|
= f.input :title, input_html: { autofocus: true }
= f.input :length, input_html: {size: 3, type: 'number', step: @event_type.program.schedule_interval, min: @event_type.program.schedule_interval}
= f.input :description
= f.input :description, as: :text, hint: markdown_hint, input_html: { rows: 5, data: { provide: 'markdown-editable' } }
= f.input :minimum_abstract_length, input_html: {size: 3}
= f.input :maximum_abstract_length, input_html: {size: 3}
= f.input :color, input_html: { size: 6, type: 'color' }

View file

@ -20,7 +20,7 @@
%td
= event_type.title
%td
= event_type.description
= markdown(event_type.description)
%td
= event_type.length
Minutes

View file

@ -6,9 +6,9 @@
= "(#{@events.length})" if @events.any?
.btn-group.pull-right
%button.btn.btn-primary{ title: 'Mass import of commercials for events',
%button.btn.btn-primary{ title: 'Mass import of materials for events',
data: { toggle: 'modal', target: '#mass-commercials-modal' } }
Add Commercials
Add Materials
- if can? :create, Event
= link_to 'Add Event',
@ -28,7 +28,7 @@
.modal-dialog
.modal-content
.modal-header
%h1 Add commercials to events
%h1 Add materials to events
.text-muted
Upload your file with data in the following format:
%b Event_ID:Commercial_Link

View file

@ -11,7 +11,7 @@
- progress_status = @event.progress_status
= progress_status.reject{ |_key, value| value || value.nil? }.length
%li
= link_to 'Commercials', '#proposal-commercials', 'data-toggle' => 'tab'
= link_to 'Materials', '#proposal-commercials', 'data-toggle' => 'tab'
.tab-content
#proposal-content.tab-pane.active
@ -42,7 +42,7 @@
- else
= general_change_description(version)
= link_to 'commercial',
= link_to 'materials',
edit_admin_conference_program_event_path(conference_id: @conference.short_title,
id: @event.id, anchor: 'commercials-content')
@ -82,7 +82,7 @@
%td{ 'class' => class_for_todo(progress_status['subtitle']) }
%span{ 'class' => [icon_for_todo(progress_status['subtitle']), 'fa-lg'] }
%tr
%td= link_to 'Add a commercial', edit_admin_conference_program_event_path(@event.program.conference.short_title, @event, anchor: 'commercials-content')
%td= link_to 'Add materials', edit_admin_conference_program_event_path(@event.program.conference.short_title, @event, anchor: 'commercials-content')
%td{ 'class' => class_for_todo(progress_status['commercials']) }
%span{ 'class' => [icon_for_todo(progress_status['commercials']), 'fa-lg'] }
- unless progress_status['track'].nil?

View file

@ -30,8 +30,6 @@
%th{ width: '0' } E-Mail
%th{ width: '0' }
%abbr{ title: 'Code of Conduct' } CoC
%th{ width: '0' } Arrival
%th{ width: '0' } Departure
%th{ width: '0' } Actions
%tbody
@ -81,22 +79,6 @@
"className": "code-of-conduct text-center",
"searchable": false
},
{
"data": "arrival",
"searchable": false,
"render": function(data, type, row) {
if (data) { return moment(data).format('ll LT'); }
return '';
}
},
{
"data": "departure",
"searchable": false,
"render": function(data, type, row) {
if (data) { return moment(data).format('ll LT'); }
return '';
}
},
{
"data": null,
"className": "actions",

View file

@ -4,9 +4,7 @@ prawn_document(force_download: true, filename: @pdf_filename, page_layout: :land
'Name',
'Nickname',
'Affiliation',
'Email',
'Arrival Date',
'Departure Date']
'Email']
@conference.questions.each do |question|
header_array << question.title
end
@ -19,8 +17,6 @@ prawn_document(force_download: true, filename: @pdf_filename, page_layout: :land
row << registration.nickname
row << registration.affiliation
row << registration.email
row << registration.arrival.to_s || ''
row << registration.departure.to_s || ''
@conference.questions.each do |question|
qa = registration.qanswers.find_by(question: question)

View file

@ -3,7 +3,7 @@
wb = xlsx_package.workbook
wb.add_worksheet(name: 'registrations') do |sheet|
bold_style = wb.styles.add_style(b: true)
row = ['Attended', 'Name', 'Nickname', 'Affilιation', 'Email', 'Arrival', 'Departure']
row = ['Attended', 'Name', 'Nickname', 'Affilιation', 'Email']
@conference.questions.each do |question|
row << question.title
@ -18,8 +18,6 @@ wb.add_worksheet(name: 'registrations') do |sheet|
row << registration.nickname
row << registration.affiliation
row << registration.email
row << registration.arrival.to_s
row << registration.departure.to_s
@conference.questions.each do |question|
qa = registration.qanswers.find_by(question: question)
answer = ( qa ? qa.answer.title : '' )
@ -30,4 +28,3 @@ wb.add_worksheet(name: 'registrations') do |sheet|
sheet.add_row row
end
end

View file

@ -14,7 +14,7 @@
%th Title
%th Speakers Registered
%th Speakers Biographies
%th Commercial
%th Materials
%th Subtitle
%th Difficulty Level
- if @program.tracks.any?

View file

@ -2,10 +2,10 @@
.col-md-12
.page-header
%h1
Events without commercials
Events Without Materials
= "(#{@events_missing_commercial.length})"
%p.text-muted
All submissions that have no commercial
All submissions that have no materials
.col-md-12
%table.datatable
%thead

View file

@ -4,7 +4,7 @@
= link_to 'All Events', '#all', 'data-toggle' => 'tab'
%li
%a{href: '#missing-commercial', 'data-toggle' => 'tab'}
Events without Commercials
Events without Materials
%span.label.label-danger{style: 'border-radius: 1em;'}
= @events_missing_commercial.length
%li

View file

@ -7,7 +7,7 @@
%li.active
= link_to 'Details', '#details-content', 'data-toggle' => 'tab'
%li
= link_to 'Commercials', '#commercials-content', 'data-toggle' => 'tab'
= link_to 'Materials', '#commercials-content', 'data-toggle' => 'tab'
.tab-content
#details-content.tab-pane.active
@ -56,4 +56,4 @@
%hr
- else
First Create Venue, then update commercial
First Create Venue, then update materials

View file

@ -12,7 +12,7 @@
-else
- if @venue.commercial.nil?
.row
%img{ "data-src" => "holder.js/500x300?text=No Commercial Set", class: 'img-responsive img-rounded' }
%img{ "data-src" => "holder.js/500x300?text=No Materials Set", class: 'img-responsive img-rounded' }
- else
- if @venue.commercial.persisted?
.thumbnail

View file

@ -2,7 +2,7 @@
.row
.col-md-12
.page-header
%h1 Editing Commercial
%h1 Edit Materials
.row
.col-md-12
= semantic_form_for @commercial, url: conference_program_proposal_commercial_path(conference_id: @conference.short_title, proposal_id: @event.id, id: @commercial.id) do |f|

View file

@ -2,7 +2,7 @@
.row
.col-md-12
.page-header
%h1 New Commercial
%h1 New Materials
.row
.col-md-12
= semantic_form_for @commercial, url: conference_program_proposal_commercials_path(conference_id: @conference.short_title, proposal_id: @event.id) do |f|

View file

@ -22,6 +22,7 @@
= render partial: 'devise/shared/sign_up_form_embedded'
= render partial: 'registration_info', locals: { f: f }
= f.input :conference_id, as: :hidden, value: @conference.id
.row
.col-md-12
%p.pull-right

View file

@ -24,10 +24,4 @@
(Scheduled on: #{event.time.to_date})
%br
= f.inputs 'Your Travel Info' do
= f.input :arrival, as: :string, label: 'Your arrival time', hint: "Leave blank if not sure", input_html: { value: (f.object.arrival.to_formatted_s(:db_without_seconds) unless f.object.arrival.nil?), id: 'registration-arrival-datepicker',start_date: @conference.start_date,end_date: @conference.end_date }
= f.input :departure, as: :string, label: 'Your departure time', hint: "Leave blank if not sure", input_html: { value: (f.object.departure.to_formatted_s(:db_without_seconds) unless f.object.departure.nil?), id: 'registration-departure-datepicker' }
= render 'conferences/code_of_conduct', organization: @conference.organization

View file

@ -33,28 +33,6 @@
data: { toggle: 'modal', target: '#modal-code-of-conduct'}
= render 'conferences/code_of_conduct',
organization: @conference.organization
.row
.col-md-12
%h4
%span.fa-stack
%i.fa.fa-square-o.fa-stack-2x
%i.fa.fa-plane.fa-stack-1x
Travel Schedule
%ul
%li
- if @registration.arrival.present?
arrive at
%strong
= @registration.arrival.strftime('%A, %B %-d. %Y %H:%M')
- else
You haven't scheduled your arrival
%li
- if @registration.departure.present?
depart at
%strong
= @registration.departure.strftime('%A, %B %-d. %Y %H:%M')
- else
You haven't scheduled your departure
- if @conference.surveys.for_registration.any?
.row
.col-md-12

View file

@ -1,6 +1,6 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#call' } Call For Content
%a.smoothscroll{ href: '#call' } Call For Participation
%section#call
.container
@ -20,3 +20,4 @@
call: call_for_booths
- if two_calls_open(call_for_events, call_for_tracks, call_for_booths)
.col-md-2.col-sm-2.hidden-xs &nbsp;
.trapezoid

View file

@ -2,7 +2,7 @@
expires_in: 1.hour) do
.col-md-4.col-sm-4.text-center
%h2
Call for Papers
Call for Participation
%p.lead
We are now accepting proposals for sessions!
%p

View file

@ -6,7 +6,7 @@
= image_tag(conference.picture_url, class: 'img-responsive') if conference.picture?
.col-md-6
%h3
= conference.title
= conference.title.html_safe
%small
%b
= date_string(conference.start_date, conference.end_date)

View file

@ -1,14 +1,14 @@
.scroll-top-wrapper
= link_to "#banner", class: "smoothscroll" do
%i.fa.fa-2x.fa-arrow-circle-up
-# .scroll-top-wrapper
-# = link_to "#banner", class: "smoothscroll" do
-# %i.fa.fa-2x.fa-arrow-circle-up
:javascript
$(function(){
$(document).on( 'scroll', function(){
if ($(window).scrollTop() > 100) {
$('.scroll-top-wrapper').addClass('show');
} else {
$('.scroll-top-wrapper').removeClass('show');
}
});
});
-# :javascript
-# $(function(){
-# $(document).on( 'scroll', function(){
-# if ($(window).scrollTop() > 100) {
-# $('.scroll-top-wrapper').addClass('show');
-# } else {
-# $('.scroll-top-wrapper').removeClass('show');
-# }
-# });
-# });

View file

@ -1,28 +1,28 @@
- cache [conference, venue, '#splash#header'] do
#banner
#banner{ style: ("background-image: url(#{conference.picture_url})" if conference.picture_url) }
.container
.row
.col-md-8.col-md-offset-2#header
.col-md-6.col-md-offset-3{id: (conference.picture? ? "header-image" : "header-no-image")}
.row
.col-md-4
- if conference.picture?
= 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
= conference.title.html_safe
%h3
- if conference.start_date && conference.end_date
%span.date.text-nowrap
= date_string(conference.start_date, conference.end_date)
- if conference.venue
%span.venue.text-nowrap
- if venue.website
- if venue.website.present?
= sanitize link_to(venue.name, venue.website)
- else
= venue.city
- if venue.country_name != 'US'
- if venue.country != 'US'
&bull;
= venue.country_name
@ -32,3 +32,4 @@
.row
.col-md-8.col-md-offset-2
= markdown(conference.description)
.trapezoid

View file

@ -17,11 +17,11 @@
.row.row-centered
- lodgings.each do |lodging|
.col-md-4.col-sm-4.col-centered.col-top
.col-md-6.col-sm-4.col-centered.col-top
.thumbnail
- if lodging.picture?
- if lodging.website_link.present?
= link_to(lodging.website_link, class: 'thumbnail') do
= link_to(lodging.website_link) do
= image_tag lodging.picture.large.url,
class: 'img-responsive img-lodging'
- else
@ -30,12 +30,16 @@
- else
%p.text-center
- if lodging.website_link.present?
= link_to(lodging.website_link, class: 'thumbnail') do
= link_to(lodging.website_link) do
%i.fa.fa-home.fa-5x
- else
%i.fa.fa-home.fa-5x
.caption
%h3.text-center
= lodging.name
- if lodging.website_link.present?
= link_to(lodging.name, lodging.website_link)
- else
= lodging.name
- if lodging.description.present?
= markdown(lodging.description)
.trapezoid

View file

@ -9,8 +9,8 @@
.col-md-12
%p.lead.text-center
%span.notranslate
= conference.title
has the most awesome program ever!
= conference.title.html_safe
will have an enaging program!
- unless highlights.blank?
= render 'highlights', conference_id: conference.short_title,
@ -31,6 +31,7 @@
= link_to(conference_schedule_path(conference.short_title),
class: 'btn btn-success btn-lg') do
Full Schedule
.trapezoid
- unless booths.blank?
- booths.each do |booth|

View file

@ -37,3 +37,4 @@
= link_to('Register Now',
new_conference_conference_registration_path(conference_id),
class: 'btn btn-lg btn-success')
.trapezoid

View file

@ -27,3 +27,4 @@
- if contact.email?
= mail_to "#{ contact.email }" do
%i.fa.fa-envelope-o.fa-4x
.trapezoid

View file

@ -27,9 +27,10 @@
.row
.col-md-12
%h3.text-center
Want to sponsor?
= "Interested in sponsoring #{conference.title}?"
= link_to(sponsorship_mailto(conference)) do
Contact us!
Please, contact us!
.trapezoid
- sponsors.each do |sponsor|
- content_for :modals do

View file

@ -7,12 +7,14 @@
.container
.row
.col-md-12.text-center
%h2
Support
= conference.title
%h2 Sign Up for Campus Housing
%br
-# %h2
-# Support
-# = conference.title
.row.row-centered
- tickets.each do |ticket|
.col-md-3.col-sm-3.col-centered.col-top
.col-lg-4.col-md-3.col-sm-3.col-centered.col-top
= link_to(conference_tickets_path(conference.short_title),
class: 'thumbnail') do
.caption
@ -21,5 +23,6 @@
.word_break
= markdown(ticket.description)
%button.btn-block.btn.btn-lg.btn-success
%i.fa.fa-ticket.fa-fw
%i.fa.fa-ticket.fa-fw{"aria-hidden": true}
= humanized_money_with_symbol(ticket.price)
.trapezoid

View file

@ -5,6 +5,12 @@
%section#venue
- if venue.location?
= render '/conferences/venue_map', venue: venue
- if venue.description.present?
.container
.row
.col-md-8.col-md-offset-2
= markdown(venue.description, escape_html=false)
.trapezoid
- else
- cache [venue, commercial, '#splash#venue'] do
.container
@ -41,3 +47,4 @@
- if venue.website
%br
= sanitize link_to(h(venue.website), h(venue.website))
.trapezoid

View file

@ -1,10 +1,10 @@
- content_for :head do
%meta{ property: "og:title", content: @conference.title }
%meta{ property: "og:site_name", content: (ENV['OSEM_NAME'] || 'OSEM') }
%meta{ property: "og:description", content: @conference.description }
%meta{ property: "og:description", content: plain_text(@conference.description) }
%meta{ property: "og:url", content: conference_url(@conference.short_title) }
%meta{ property: "twitter:title", content: (@conference.title) }
%meta{ property: "twitter:description", content: @conference.description }
%meta{ property: "twitter:description", content: plain_text(@conference.description) }
- if @conference.picture?
%meta{ property: "og:image", content: @image_url }
%meta{ property: "og:image:secure_url", content: @image_url }
@ -64,21 +64,22 @@
= render 'social_media', contact: @conference.contact
= render 'footer'
- content_for :script_head do
:javascript
var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic();
var triangle_colors = triangle_tcs.map(function(t) {
return t.toHexString();
});
$(function () {
$(document).ready(function() {
var triangle_width = document.body.clientWidth;
var triangle_height = ($( "#banner" ).height() + 200 );
var pattern = Trianglify({ width: triangle_width,
height: triangle_height,
cell_size: 100,
x_colors: triangle_colors
});
$('#banner').css('background-image', 'url("' + pattern.png() + '")');
});
});
-# - content_for :script_head do
-# :javascript
-# var triangle_tcs = tinycolor("#{h(@conference.color)}").monochromatic();
-# var triangle_colors = triangle_tcs.map(function(t) {
-# return t.toHexString();
-# });
-# $(function () {
-# $(document).ready(function() {
-# var triangle_width = document.body.clientWidth;
-# var triangle_height = ($( "#banner" ).height() + 200 );
-# var pattern = Trianglify({ width: triangle_width,
-# height: triangle_height,
-# cell_size: 100,
-# x_colors: triangle_colors
-# });
-# $('#banner').css('background-image', 'url(' + 0 + ')');
-# });
-# });

View file

@ -1,7 +1,14 @@
.text-center
.btn-group.btn-group-lg#openid-btn-grp
- omniauth_configured.each do |provider|
= link_to "user_#{provider}_omniauth_authorize".to_sym, class: "btn btn-success btn-lg",
id: "omniauth-#{provider}",
title: "Your #{provider} login" do
%i{class: "fa fa-#{provider}"}
- if provider != :discourse
= link_to "user_#{provider}_omniauth_authorize".to_sym, class: "btn btn-success btn-lg",
id: "omniauth-#{provider}",
title: "Your #{provider} login" do
%i{class: "fa fa-#{provider}"}
- else
= link_to("Snap!",
"user_#{provider}_omniauth_authorize".to_sym,
class: "btn btn-success btn-lg",
id: "omniauth-#{provider}",
title: "Your #{provider} login")

View file

@ -1,25 +1,26 @@
- if ENV['OSEM_ICHAIN_ENABLED'] != 'true'
= form_tag(new_user_session_path, class: 'form-horizontal') do
%legend
%span
Sign In
.form-group
%label{for: "user[login]", class: 'col-sm-2 control-label'}
Username
.col-sm-10
= text_field_tag 'user[login]', nil, placeholder: 'Username', class: 'form-control', required: 'required'
.form-group
%label{for: "user[password]", class: 'col-sm-2 control-label'}
Password
.col-sm-10
= password_field_tag 'user[password]', nil, placeholder: 'Password', class: 'form-control', required: 'required'
.form-group
.col-sm-12
%button.btn.btn-success.pull-right
Sign in
= render partial: 'devise/shared/openid'
%p.text-right
%a.small.btn.btn-default{"data-toggle" => "collapse", "data-target" => "#devise-help-sign-in"}
Need Help?
#devise-help-sign-in.collapse
= render partial: 'devise/shared/links'
.container.panel
= form_tag(new_user_session_path, class: '') do
%legend
%span
Sign In
.form-group
%label{for: "user[login]", class: 'col-sm-2 control-label'}
Username
.col-sm-10
= text_field_tag 'user[login]', nil, placeholder: 'Username', class: 'form-control', required: 'required'
.form-group
%label{for: "user[password]", class: 'col-sm-2 control-label'}
Password
.col-sm-10
= password_field_tag 'user[password]', nil, placeholder: 'Password', class: 'form-control', required: 'required'
.form-group
.col-sm-12
%button.btn.btn-success.pull-right
Sign in
= render partial: 'devise/shared/openid'
%p.text-right
%a.small.btn.btn-default{"data-toggle" => "collapse", "data-target" => "#devise-help-sign-in"}
Need Help?
#devise-help-sign-in.collapse
= render partial: 'devise/shared/links'

View file

@ -43,7 +43,7 @@
= link_to 'Contact', edit_admin_conference_contact_path(@conference.short_title)
- if can? :index, @conference.commercials.build
%li{class: "#{active_nav_li(admin_conference_commercials_path(@conference.short_title))}"}
= link_to 'Commercials', admin_conference_commercials_path(@conference.short_title)
= link_to 'Materials', admin_conference_commercials_path(@conference.short_title)
- if can? :update, @conference
%li{class: active_nav_li(edit_admin_conference_splashpage_path(@conference.short_title))}
= link_to 'Splashpage', admin_conference_splashpage_path(@conference.short_title)

View file

@ -1,7 +1,6 @@
.navbar.navbar-default.navbar-fixed-top.nav-osem{role: 'navigation'}
%nav.navbar.navbar-default.navbar-fixed-top.nav-osem{role: 'navigation'}
.container
.navbar-header
- if controller.class.name.split("::").first=="Admin"
%button{ "data-target"=>"#side-nav", "data-toggle"=>"collapse", class: 'navbar-toggle side-nav-btn', type: 'button' }
%span.sr-only Toggle navigation
@ -14,7 +13,7 @@
%span.icon-bar
%span.icon-bar
%span.icon-bar
= nav_root_link_for conference
= nav_root_link_for(conference)
.collapse.navbar-collapse#main-nav
- if content_for :splash_nav
@ -42,34 +41,41 @@
= link_to(new_registration_path('user')) do
%span.fa.fa-heart
Sign Up
%li.dropdown.visible-desktop
%a.dropdown-toggle{"data-toggle" => "dropdown", href: '#'}
%span.fa.fa-user
Sign In
%span.caret
.dropdown-menu
- if ENV['OSEM_ICHAIN_ENABLED'] == 'true'
= form_tag User.ichain_login_url do
= text_field_tag 'username', nil, id: 'user_ichain_email_dd', class: 'form-control', placeholder: 'Username'
= password_field_tag 'password', nil, id: 'user_ichain_password_dd', class: 'form-control', placeholder: 'Password'
%button.btn.btn-success.btn-block Sign in
- else
= form_tag new_user_session_path do
= text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail'
= password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password'
%p.text-right
%small
%label{for: 'user_remember_me'} Remember me
= check_box_tag 'user[remember_me]'
%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{class: ""}
= link_to(sign_in_path) do
%span.fa.fa-user
Sign In
-# %li.dropdown.visible-desktop
-# %a.dropdown-toggle{"data-toggle" => "dropdown", href: '#'}
-# %span.fa.fa-user
-# Sign In
-# %span.caret
-# .dropdown-menu
-# - if ENV['OSEM_ICHAIN_ENABLED'] == 'true'
-# = form_tag User.ichain_login_url do
-# = text_field_tag 'username', nil, id: 'user_ichain_email_dd', class: 'form-control', placeholder: 'Username'
-# = password_field_tag 'password', nil, id: 'user_ichain_password_dd', class: 'form-control', placeholder: 'Password'
-# %button.btn.btn-success.btn-block Sign in
-# - else
-# %div{style: "padding: 6px"}
-# = form_tag new_user_session_path, class: 'form-group' do
-# = text_field_tag 'user[login]', nil, id: 'user_login_dd', class: 'form-control', placeholder: 'Username / E-Mail'
-# = password_field_tag 'user[password]', nil, id: 'user_password_dd', class: 'form-control', placeholder: 'Password'
-# %p.text-right
-# %small
-# %label{for: 'user_remember_me'} Remember me
-# = check_box_tag 'user[remember_me]'
-# %br
-# %button.btn.btn-success.btn-block Sign in
-# - unless omniauth_configured.empty?
-# .divider
-# %h6.text-center
-# or
-# = render 'devise/shared/openid_links'
-# %p.text-right
-# %br
-# %a.small.btn.btn-xs.btn-default{"data-toggle" => "collapse", "data-target" => "#navbar-devise-help"}
-# Need Help?
-# #navbar-devise-help.collapse
-# = render 'devise/shared/links'
.trapezoid

View file

@ -1,10 +1,10 @@
%html{xmlns: 'http://www.w3.org/1999/html'}
%html{lang: 'en'}
%head
%meta{charset: 'utf-8'}
%meta{name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1'}
%title= content_for?(:title) ? yield(:title) : (ENV['OSEM_NAME'] || 'OSEM')
%meta{content: '', name: 'description'}
%meta{content: '', name: 'author'}
%meta{name: 'viewport', content: 'width=device-width, initial-scale=1'}
%title= content_for?(:title) ? strip_tags( yield(:title) ) : (ENV['OSEM_NAME'] || 'OSEM')
%meta{content: 'Snap!Con -- A conference all about Snap!, a programing language from UC Berkeley.', name: 'description'}
%meta{content: 'Michael Ball, Brian Harvey, Jens Moenig, Bernat Romagosa, Dan Garcia, Lauren Mock', name: 'author'}
= stylesheet_link_tag "application", media: 'all'
= javascript_include_tag "application"
@ -26,7 +26,7 @@
-# Admin area
- if controller.class.name.split("::").first=="Admin"
= render 'layouts/admin'
-else
- else
#messages
.container
= render 'layouts/messages'
@ -45,7 +45,7 @@
#{link_to "MIT license", "http://opensource.org/licenses/MIT"}.
You can run, copy, distribute, study, change and improve it.
The source code and the developers are on
#{link_to "GitHub", "https://github.com/openSUSE/osem"}.
#{link_to "GitHub", "https://github.com/snap-cloud/snapcon"}. This site is a modification of #{link_to "OSEM", "https://github.com/openSUSE/osem"}.
- if ENV["SKYLIGHT_PUBLIC_DASHBOARD_URL"].present?
Performance data is available on
#{link_to "Skylight", ENV["SKYLIGHT_PUBLIC_DASHBOARD_URL"]}.

View file

@ -16,6 +16,7 @@
%th ID
%th Type
%th User
%th Registration?
%th Actions
%tbody
- @physical_tickets.each do |physical_ticket|
@ -23,6 +24,7 @@
%td= physical_ticket.id
%td= physical_ticket.ticket.title
%td= physical_ticket.user.name
%td= physical_ticket.ticket.registration_ticket? ? 'Yes' : 'No'
%td
.btn-group
= link_to 'Show',

View file

@ -3,15 +3,15 @@
%li.active
= link_to 'Proposal', '#proposal-content', 'data-toggle' => 'tab'
%li
= link_to 'Commercials', '#commercials-content', 'data-toggle' => 'tab'
= link_to 'Materials', '#commercials-content', 'data-toggle' => 'tab'
.tab-content
#proposal-content.tab-pane.active
= render 'proposals/proposal_form'
#commercials-content.tab-pane
%p.text-muted
You can add commercials for your proposal. These commercials will be displayed on the
You can add materals for your proposal. These materials will be displayed on the
= link_to 'public proposal page.', conference_program_proposal_path(@conference.short_title, @event)
If you don't add a commercial, the conference commercial will be displayed!
If you don't add any materials, the conference materials will be displayed.
- if can? :create, @event.commercials.new
.row
.col-md-6

View file

@ -20,7 +20,7 @@
= link_to 'Add a subtitle', edit_conference_program_proposal_path(event.program.conference.short_title, event)
%li{'class'=>class_for_todo(progress_status['commercials'])}
%span{'class'=>icon_for_todo(progress_status['commercials'])}
= link_to 'Add a commercial', edit_conference_program_proposal_path(event.program.conference.short_title, event, anchor: 'commercials-content')
= link_to 'Add materials', edit_conference_program_proposal_path(event.program.conference.short_title, event, anchor: 'commercials-content')
- unless progress_status['track'].nil?
%li{'class'=>class_for_todo(progress_status['track'])}
%span{'class'=>icon_for_todo(progress_status['track'])}

View file

@ -7,7 +7,7 @@
- if @program.cfp.description.present?
.row
.col-md-12
= markdown(@program.cfp.description)
= markdown(@program.cfp.description, escape_html=false)
.row
.col-md-12
= render partial: 'encouragement_text'
@ -43,10 +43,10 @@
- @program.event_types.each do |event_type|
%span{ class: 'help-block event_event_type_id collapse', id: "#{event_type.id}-help" }
= event_type.description
= markdown(event_type.description)
= f.input :abstract, required: true, input_html: { rows: 5, data: { provide: 'markdown-editable' } },
hint: markdown_hint('[Tips to improve your presentations.](http://blog.hubspot.com/blog/tabid/6307/bid/5975/10-Rules-to-Instantly-Improve-Your-Presentations.aspx)')
hint: markdown_hint
%p
You have used

View file

@ -3,9 +3,9 @@
.media
.media-body
%h4.media-heading= ticket.title
%h5.media-heading= markdown(ticket.description)
- if @conference.tickets.for_registration.any?
%td.col-sm-1.col-md-2.text-center
.media-heading= markdown(ticket.description)
%td.col-sm-1.col-md-2
%span.text-center
= ticket.registration_ticket? ? 'Yes' : 'No'
%td.col-sm-1.col-md-1
:ruby

View file

@ -13,8 +13,7 @@
%thead
%tr
%th Ticket
- if @conference.tickets.for_registration.any?
%th Registration Ticket
%th Registration?
%th Quantity
%th Price
%th Total
@ -23,8 +22,7 @@
= render 'ticket', f: f, ticket: ticket
%tr
%td
- if @conference.tickets.for_registration.any?
%td
%td
%td
%td.col-sm-1.col-md-1.text-center
%h4