Commit 90c47708 authored by Mario Manno's avatar Mario Manno

replace formtastic/formtastic-bootstrap with simple_form

parent 43d77208
......@@ -28,10 +28,8 @@ gem 'acts_as_commentable'
gem 'bcrypt-ruby'
gem 'cancancan'
gem 'cocoon'
gem 'formtastic'
gem 'formtastic-bootstrap'
gem 'haml'
gem 'localized_language_select', '0.3.0', :git => "git://github.com/frab/localized_language_select.git"
gem 'localized_language_select', github: "frab/localized_language_select", branch: 'master'
gem 'nokogiri'
gem "paperclip", "~> 4.1"
gem 'paper_trail'
......@@ -39,6 +37,7 @@ gem 'prawn', '< 1.0'
gem 'prawn_rails'
gem 'ransack'
gem 'ri_cal'
gem 'simple_form'
gem 'sucker_punch'
gem 'settingslogic'
gem 'transitions', :require => ["transitions", "active_record/transitions"]
......
GIT
remote: git://github.com/frab/localized_language_select.git
revision: c4f785b450fd042696aceeaae513ad11c076bd1a
revision: 85df6b97789de6e29c630808b630e56a1b76f80c
branch: master
specs:
localized_language_select (0.3.0)
rails (>= 4.1.0)
......@@ -78,10 +79,6 @@ GEM
factory_girl_rails (4.5.0)
factory_girl (~> 4.5.0)
railties (>= 3.0.0)
formtastic (3.1.3)
actionpack (>= 3.2.13)
formtastic-bootstrap (3.1.1)
formtastic (>= 3.0)
github-markdown (0.6.8)
globalid (0.3.5)
activesupport (>= 4.1.0)
......@@ -108,7 +105,7 @@ GEM
mime-types (2.6.1)
mimemagic (0.3.0)
mini_portile (0.6.2)
minitest (5.7.0)
minitest (5.8.0)
multi_json (1.11.2)
mysql2 (0.3.19)
nokogiri (1.6.6.2)
......@@ -190,6 +187,9 @@ GEM
sprockets-rails (>= 2.0, < 4.0)
tilt (~> 1.1)
settingslogic (2.0.9)
simple_form (3.1.0)
actionpack (~> 4.0)
activemodel (~> 4.0)
slop (3.6.0)
sprockets (3.2.0)
rack (~> 1.0)
......@@ -227,15 +227,13 @@ DEPENDENCIES
cocoon
coffee-rails (~> 4.1.0)
factory_girl_rails (~> 4.0)
formtastic
formtastic-bootstrap
github-markdown
haml
jbuilder (~> 2.0)
jquery-migrate-rails
jquery-rails
jquery-ui-rails
localized_language_select (= 0.3.0)!
localized_language_select!
mysql2
nokogiri
paper_trail
......@@ -254,6 +252,7 @@ DEPENDENCIES
ruby-prof
sass-rails (~> 5.0)
settingslogic
simple_form
sqlite3
sucker_punch
transitions
......
$(document).ready(function() {
<% environment.context_class.instance_eval { include EventRatingsHelper } %>
$(function() {
$("#my_rating").raty({
path: "",
starOn: '#{raty_icon_path("on")}',
starHalf: '#{raty_icon_path("half")}',
starOff: '#{raty_icon_path("off")}',
starOn: "<%= raty_icon_path('on') %>",
starHalf: "<%= raty_icon_path('half') %>",
starOff: "<%= raty_icon_path('off') %>",
half: true,
start: $("#event_rating_rating").val(),
target: "#event_rating_rating",
......@@ -13,9 +14,9 @@ $(document).ready(function() {
$("#total_rating").raty({
readOnly: true,
path: "",
starOn: '#{raty_icon_path("on")}',
starHalf: '#{raty_icon_path("half")}',
starOff: '#{raty_icon_path("off")}',
starOn: "<%= raty_icon_path('on') %>",
starHalf: "<%= raty_icon_path('half') %>",
starOff: "<%= raty_icon_path('off') %>",
half: true,
start: $("#total_rating").data("rating")
});
......@@ -23,17 +24,16 @@ $(document).ready(function() {
$(this).raty({
readOnly: true,
path: "",
starOn: '#{raty_icon_path("on")}',
starHalf: '#{raty_icon_path("half")}',
starOff: '#{raty_icon_path("off")}',
starOn: "<%= raty_icon_path('on') %>",
starHalf: "<%= raty_icon_path('half') %>",
starOff: "<%= raty_icon_path('off') %>",
half: true,
start: $(this).data('rating')
start: $(this).data("rating")
});
});
$('[data-function="toggle-description"]').click(function() {
$('#full_description').toggle();
$("[data-function='toggle-description']").click(function() {
$("#full_description").toggle();
return false
});
});
/*
*= require formtastic-bootstrap
*= require bootstrap
*= require formtastic_changes
*= require jquery-ui-bootstrap
*= require frab
*= require_self
......
/* -------------------------------------------------------------------------------------------------
Load this stylesheet after formtastic.css in your layouts to override the CSS to suit your needs.
This will allow you to update formtastic.css with new releases without clobbering your own changes.
For example, to make the inline hint paragraphs a little darker in color than the standard #666:
form.formtastic fieldset > ol > li p.inline-hints { color:#333; }
HINT:
The following style may be *conditionally* included for improved support on older versions of IE(<8)
form.formtastic fieldset ol li fieldset legend { margin-left: -6px;}
--------------------------------------------------------------------------------------------------*/
form.formtastic div.nested-fields fieldset hr{
margin-left: 150px;
}
/*
*= require formtastic
*= require formtastic_changes
*= require_self
*
*/
......@@ -62,7 +60,7 @@ body {
color: #666;
padding: 10px 25px;
text-align: center;
display:block;
display:block;
font: bold 12px verdana, sans-serif;
text-decoration: none;
line-height: 125%;
......@@ -354,4 +352,4 @@ dt, dd {
dt {
font: bold 12px verdana, sans-serif;
}
\ No newline at end of file
}
......@@ -34,14 +34,13 @@ class Public::ScheduleController < ApplicationController
@skip_row = {}
@all_rooms.each do |room|
events = room.events.confirmed.no_conflicts.is_public.scheduled_on(@day).order(:start_time).to_a
unless events.empty?
@events[room] = events
@skip_row[room] = 0
@rooms << room
end
next if events.empty?
@events[room] = events
@skip_row[room] = 0
@rooms << room
end
if @rooms.empty?
return redirect_to public_schedule_index_path, :notice => "No events are scheduled."
return redirect_to public_schedule_index_path, :notice => "No events are public and scheduled."
end
respond_to do |format|
......
......@@ -8,6 +8,11 @@ module EventsHelper
end
end
def event_start_time
return '' unless @event.start_time
I18n.l(@event.start_time, format: :pretty_datetime)
end
def timeslots
slots = Array.new
(@conference.max_timeslots+1).times do |i|
......@@ -16,18 +21,6 @@ module EventsHelper
slots
end
def start_times
times = Array.new
@conference.days.each { |day|
time = day.start_date
while time <= day.end_date
times << [time.strftime("%Y-%m-%d %H:%M"), time]
time = time.since(@conference.timeslot_duration.minutes)
end
}
times
end
def format_time_slots(number_of_time_slots)
duration_in_minutes = number_of_time_slots * @conference.timeslot_duration
duration_to_time(duration_in_minutes)
......
class BootstrapLanguageInput < FormtasticBootstrap::Inputs::SelectInput
def collection
result = Array.new
priority_languages = input_options.delete(:priority_languages) || nil
if priority_languages
result += LocalizedLanguageSelect::priority_languages_array(priority_languages)
result << ["----------", ""]
end
result += LocalizedLanguageSelect::localized_languages_array(options)
end
end
class DateInput < FormtasticBootstrap::Inputs::StringInput
def input_html_options
super.update(value: object.send(method).try(:to_s, :db))
end
end
class InlineBooleanInput < SimpleForm::Inputs::BooleanInput
# Render 'inline' boolean control, regardless of the value of config.boolean_style
def input(wrapper_options = nil)
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
build_check_box(unchecked_value, merged_input_options)
end
end
class LanguageSelectInput < SimpleForm::Inputs::CollectionSelectInput
def input(wrapper_options = nil)
@collection = []
prepend_priority_languages(options.delete(:priority))
@collection += LocalizedLanguageSelect::localized_languages_array(wrapper_options[:collection] || {})
filter_collection(options[:only])
super(wrapper_options)
end
private
SEP = "----------"
BLANK = ""
def filter_collection(only)
return unless only
only += [SEP, BLANK]
@collection.delete_if { |language, code| not code.in?(only) }
end
def prepend_priority_languages(priority_languages)
return unless priority_languages
@collection += LocalizedLanguageSelect::priority_languages_array(priority_languages)
@collection << [SEP, BLANK]
end
end
class RatingInput < FormtasticBootstrap::Inputs::HiddenInput
def to_html
builder.hidden_field(method, input_html_options) + "<div id=\"my_rating\"></div>".html_safe
class RatingInput < SimpleForm::Inputs::HiddenInput
def input(wrapper_options = nil)
template.concat super(wrapper_options)
template.concat ratings_div
end
def ratings_div
template.content_tag(:div, id: 'my_rating') do
end
end
end
class TimeInput < FormtasticBootstrap::Inputs::StringInput
def input_html_options
super.update(value: object.send(method).try(:strftime, "%H:%M"))
end
end
......@@ -26,9 +26,20 @@ class Day < ActiveRecord::Base
}
end
def start_times
times = []
time = start_date
while time <= end_date
times << I18n.l(time, format: :pretty_datetime)
time = time.since(conference.timeslot_duration.minutes)
end
times
end
def label
self.start_date.strftime('%Y-%m-%d')
end
alias_method :to_label, :label
def date
self.start_date.to_date
......
......@@ -130,7 +130,7 @@ class Event < ActiveRecord::Base
end
def to_sortable
self.title.gsub(/[^\d\w]/, '').upcase
self.title.gsub(/[^\w]/, '').upcase
end
def process_acceptance(options)
......
= semantic_form_for @call_for_papers, :url => call_for_papers_path do |f|
= f.inputs do
= simple_form_for @call_for_papers, url: call_for_papers_path do |f|
%fieldset.inputs
= f.input :start_date, :hint => "Pick a date when your CfP should be open for the public."
= f.input :end_date, :hint => "Pick a deadline for paper submission. This deadline will be displayed to the users but not otherwise enforced."
= f.input :hard_deadline, :hint => "Pick a hard deadline. No paper submission will be possible after this date. Leave empty if you want to allow submissions indefinitely."
= f.input :welcome_text, :hint => "Enter a welcome message or additional instructions you want to display to participants. (HTML)"
= f.input :info_url, :hint => "A web page that contains additional information about the Call for Papers. Please enter a full URL including 'http://'"
= f.input :contact_email, :hint => "An email address where participants can contact you in case they have any questions."
= f.buttons do
= f.commit_button :button_html => {:class => "btn primary"}
.actions
= f.button :submit, class: 'primary'
- call_for_papers = @conference.call_for_papers
= semantic_form_for(call_for_papers, url: call_for_papers_path) do |f|
= simple_form_for(call_for_papers, url: call_for_papers_path) do |f|
= dynamic_association :notifications, t(:notifications), f
= f.buttons do
= f.commit_button :button_html => {:class => "btn primary"}
.actions
= f.button :submit, class: 'primary'
- uuid = "nf#{get_uuid}"
%div{ :id => uuid }
= f.inputs do
%fieldset.inputs
= link_to "use default text", "#", style: 'float:right', data: { function: 'notification-defaults', args: "#{uuid}" }
= f.input :locale, as: :select, collection: available_locales(@conference), hint: "Available locales for this conference and its speakers"
= f.input "accept_subject", label: 'Accept subject'
......
%section
.page-header
%h1=t("cfp.resend_confirmation_headline")
%h1=t("cfp.resend_confirmation_headline")
.row
.span16
= render "shared/flash", :flash => flash
= semantic_form_for(@user, :url => cfp_user_confirmation_path, :html => { :method => :post }) do |f|
= f.inputs do
= simple_form_for(@user, url: cfp_user_confirmation_path, :html => { :method => :post }) do |f|
%fieldset.inputs
= f.input :email
= f.buttons do
= f.commit_button t("cfp.resend_confirmation_button"), :button_html => {:class => "btn primary"}
= link_to t("cfp.back"), :back, :class => "btn"
.actions
= f.button :submit, t("cfp.resend_confirmation_button"), class: 'primary'
= link_to t("cfp.back"), :back, :class => "btn"
= semantic_form_for([:cfp, @event], :html => {:multipart => true}) do |f|
= f.inputs :name => t("cfp.basic_information") do
= simple_form_for([:cfp, @event], :html => {:multipart => true}) do |f|
%fieldset.inputs
%legend= t("cfp.basic_information")
= f.input :title
= f.input :subtitle
= f.input :event_type, :collection => translated_options(Event::TYPES)
= f.input :track, :collection => @conference.tracks
= f.association :track
= f.input :time_slots, :as => :select, :collection => timeslots, :hint => t("cfp.event_time_slots_hint")
= f.input :language, :as => :bootstrap_language, :only => @conference.language_codes, :include_blank => ""
= f.input :language, as: :language_select, only: @conference.language_codes, include_blank: true
= f.input :logo
= f.inputs :name => t("cfp.detailed_description") do
%fieldset.inputs
%legend= t("cfp.detailed_description")
= f.input :abstract, :input_html => {:rows => 4}, :hint => t("cfp.event_abstract_hint")
= f.input :description, :hint => t("cfp.event_description_hint")
= f.input :submission_note, :hint => "visible for admins and users, contains additional information."
= f.input :do_not_record, :as => :boolean, :hint => "If the conference records talks and there is an opt-out: do you want your talk recorded?", input_html: deny_accepted(@event)
= f.input :do_not_record, as: :inline_boolean, :hint => "If the conference records talks and there is an opt-out: do you want your talk recorded?", input_html: deny_accepted(@event)
= f.input :recording_license, hint: "Please contact the conference crew, if you want another license.", input_html: { readonly: true, disabled: true }
= dynamic_association :links, t("cfp.links"), f
= dynamic_association :event_attachments, t("cfp.uploaded_files"), f
= f.buttons do
= f.commit_button :button_html => {:class => "btn primary"}
.actions
= f.button :submit, class: 'primary'
......@@ -4,11 +4,11 @@
.row
.span16
= render "shared/flash", :flash => flash
= semantic_form_for(@user, :url => cfp_user_password_path, :html => { :method => :put }) do |f|
= simple_form_for(@user, url: cfp_user_password_path, :html => { :method => :put }) do |f|
= f.hidden_field :reset_password_token
= f.inputs do
%fieldset.inputs
= f.input :password
= f.input :password_confirmation
= f.buttons do
= f.commit_button t("cfp.change_password_button"), :button_html => {:class => "btn primary"}
.actions
= f.button :submit, t("cfp.change_password_button"), class: 'primary'
= link_to t("cfp.back"), :back, :class => "btn"
%section
.page-header
%h1=t("cfp.forgot_password_headline")
%h1=t("cfp.forgot_password_headline")
.row
.span16
= render "shared/flash", :flash => flash
= semantic_form_for(@user, :url => cfp_user_password_path, :html => { :method => :post }) do |f|
= f.inputs do
= simple_form_for(@user, url: cfp_user_password_path, :html => { :method => :post }) do |f|
%fieldset.inputs
= f.input :email
= f.buttons do
= f.commit_button t("cfp.send_reset_instructions"), :button_html => {:class => "btn primary"}
.actions
= f.button :submit, t("cfp.send_reset_instructions"), class: 'primary'
= link_to t("cfp.back"), :back, :class => "btn"
= semantic_form_for(@person, :url => cfp_person_path, :html => {:multipart => true}) do |f|
= f.inputs :name => "Basic" do
= simple_form_for(@person, url: cfp_person_path, :html => {:multipart => true}) do |f|
%fieldset.inputs
%legend Basic
= f.input :first_name
= f.input :last_name
= f.input :public_name, :hint => t("cfp.public_name_hint")
= f.input :gender, :collection => translated_options(Person::GENDERS)
= f.input :avatar, :hint => t("cfp.avatar_hint")
= dynamic_association :languages, t("cfp.languages_spoken"), f
= f.inputs :name => t("cfp.contact_data") do
%fieldset.inputs
%legend= t("cfp.contact_data")
= f.input :email, :hint => t("cfp.email_hint")
= f.input :email_public, :as => :boolean, :hint => t("cfp.email_public_hint")
= f.input :email_public, as: :inline_boolean, :hint => t("cfp.email_public_hint")
= dynamic_association :phone_numbers, t("cfp.phone_numbers"), f
= dynamic_association :im_accounts, t("cfp.im_accounts"), f
= f.inputs :name => t("cfp.bio") do
%fieldset.inputs
%legend= t("cfp.bio")
= f.input :abstract, :input_html => {:rows => 4}, :hint => t("cfp.abstract_hint")
= f.input :description, :hint => t("cfp.description_hint")
= dynamic_association :links, t("cfp.links"), f
= f.buttons do
= f.commit_button :button_html => {:class => "btn primary"}
.actions
= f.button :submit, class: 'primary'
.nested-fields
= f.inputs do
%fieldset.inputs
= f.input :im_type, :collection => ImAccount::TYPES
= f.input :im_address
= remove_association_link :im_account, f
.nested-fields
= f.inputs do
%fieldset.inputs
= f.input :phone_type, :as => :select, :collection => translated_options(PhoneNumber::TYPES)
= f.input :phone_number
= remove_association_link :phone_number, f
......@@ -21,14 +21,14 @@
.span8
%h2=t("cfp.login_existing_headline")
%p=t("cfp.login_existing_description")
= semantic_form_for @user, :url => cfp_session_path do |f|
= f.inputs do
= simple_form_for @user, url: cfp_session_path do |f|
%fieldset.inputs
= f.input :email
= f.input :password
- if false
= f.input :remember_me, :as => :boolean
= f.buttons do
= f.commit_button t("cfp.sign_in"), :button_html => {:class => "btn primary"}
= f.input :remember_me, as: :inline_boolean
.actions
= f.button :submit, t("cfp.sign_in"), class: 'primary'
.span8
%h2=t("cfp.sign_up_headline")
%p=t("cfp.sign_up_description", :title => @conference.title)
......
......@@ -3,11 +3,11 @@
%h1=t("cfp.edit_account")
.row
.span16
= semantic_form_for(@user, :url => cfp_user_path, :html => { :method => :put }) do |f|
= f.inputs do
= simple_form_for(@user, url: cfp_user_path, :html => { :method => :put }) do |f|
%fieldset.inputs
= f.input :email
= f.input :password, :hint => t("cfp.password_hint")
= f.input :password_confirmation
= f.buttons do
= f.commit_button t("cfp.update"), :button_html => {:class => "btn primary"}
.actions
= f.button :submit, t("cfp.update"), class: 'primary'
= link_to t("cfp.back"), :back, :class => "btn"
......@@ -5,11 +5,11 @@
Sign up
.row
.span16
= semantic_form_for(@user, :url => cfp_user_path) do |f|
= f.inputs do
= simple_form_for(@user, url: cfp_user_path) do |f|
%fieldset.inputs
= f.input :email
= f.input :password
= f.input :password_confirmation
= f.buttons do
= f.commit_button t("cfp.sign_up"), :button_html => {:class => "btn primary"}
.actions
= f.button :submit, t("cfp.sign_up"), class: 'primary'
= link_to t("cfp.back"), new_cfp_session_path, :class => "btn"
......@@ -24,14 +24,14 @@
%h2=t("cfp.login_existing_headline")
%p
%p=t("cfp.login_existing_description")
= semantic_form_for @user, :url => cfp_session_path do |f|
= f.inputs do
= simple_form_for @user, url: cfp_session_path do |f|
%fieldset.inputs
= f.input :email
= f.input :password
- if false
= f.input :remember_me, :as => :boolean
= f.buttons do
= f.commit_button t("cfp.sign_in"), :button_html => {:class => "btn primary"}
= f.input :remember_me, as: :inline_boolean
.actions
= f.button :submit, t("cfp.sign_in"), class: 'primary'
.span8
%h2=t("cfp.sign_up_headline")
%p=t("cfp.sign_up_description", :title => @conference.title)
......
<div class="nested-fields">
<%= f.inputs do %>
<%= f.input :start_date, :hint => "yyyy-mm-dd hh:mm", :as => :datetime_select %>
<%= f.input :end_date, :hint => "yyyy-mm-dd hh:mm", :as => :datetime_select %>
<fieldset class="inputs">
<%= f.input :start_date, html5: true, :hint => "yyyy-mm-dd hh:mm", :as => :datetime%>
<%= f.input :end_date, html5: true, :hint => "yyyy-mm-dd hh:mm", :as => :datetime%>
<%= remove_association_link :day, f %>
<% end %>
</fieldset>
</div>
<script>
$(function() {
$('div.datetime input').datetimepicker({
$('div.datetime input').datetimepicker({
dateFormat: "yy-mm-dd",
timeFormat: "hh:mm"
});
......
= semantic_form_for(@conference, :url => @conference.new_record? ? create_conference_path : conference_path) do |f|
= f.inputs t(:basic_information) do
= simple_form_for(@conference, url: @conference.new_record? ? create_conference_path : conference_path) do |f|
%fieldset.inputs
%legend= t(:basic_information)
= f.input :title, :hint => "The name of your conference as it shall appear throughout the site. Example: 'FrOSCon'"
= f.input :acronym, :hint => "A short and unique handle for your conference, using only lower-case letters, numbers and underscores. This will be used to identify your conference in URLs etc. Example: 'froscon2011'"
= f.input :email, :hint => "Contact email address for your conference. Will be used as reply-to address in emails sent out by the system."
= f.input :color, :hint => "You may define a color for your conference."
= f.inputs t(:timeslot_configuration) do
%fieldset.inputs
%legend= t(:timeslot_configuration)
= f.input :timezone, :as => :time_zone, :hint => "Please select in what time zone your conference will take place. This is needed to correctly display times for your events."
= f.input :timeslot_duration, :as => :select, :collection => timeslot_durations(@conference), :hint => "How long do you want the smallest timeslots to be? This essentially defines the grid on which you can plan your program. WARNING: This one is tricky and cannot be easily changed later, so give this some thought. In general, larger timeslots make things a lot simpler, but smaller ones make you more flexible. Example: If all you need is to schedule 30 minute talks that perfectly align with full and half hours, choose 30 minutes as slot size. If you have 1 hour long talks and 15 minute breaks between them, 15 minutes is the perfect slot size. Note that you can make the slot size smaller later on, as long as the old slot size is a multiple of the new one. So going from 15 minutes down to 5 is fine, while going down to 10 minutes will not work."
= f.input :default_timeslots, :as => :select, :collection => 1..20, :hint => "What is the default length of your events? Example: If you chose a timeslot duration of 15 minutes to account for breaks, but your talks are usually 1 hour long, select 4, because 4 times 15 minutes is one hour."
= f.input :max_timeslots, :as => :select, :collection => 1..100, :hint => "What is the maximum length of a single event (e.g. a single talk)?"
= dynamic_association :languages, t(:event_languages), f, :hint => "Choose which languages events in this conference can be held in."
= f.inputs t(:submission_configuration) do
= f.input :event_state_visible, :as => :boolean, :hint => "If you enable this, speakers will be able to look up the state of their submission in the cfp interface and confirm their attendance by pressing the confirm button."
%fieldset.inputs
%legend= t(:submission_configuration)
= f.input :event_state_visible, as: :inline_boolean, :hint => "If you enable this, speakers will be able to look up the state of their submission in the cfp interface and confirm their attendance by pressing the confirm button."
= f.input :default_recording_license, :hint => "Default recording license for all talks"
= f.inputs t(:feedback_system) do
= f.input :feedback_enabled, :as => :boolean, :hint => "If you enable this, your program export will include links to a feedback form where attendees can rate an event."
= f.inputs t(:ticket_server) do
= f.input :ticket_type, :as => :radio, :collection => Conference::TICKET_TYPES
= f.buttons do
= f.commit_button :button_html => {:class => "btn primary"}
%fieldset.inputs
%legend= t(:feedback_system)
= f.input :feedback_enabled, as: :inline_boolean, :hint => "If you enable this, your program export will include links to a feedback form where attendees can rate an event."
%fieldset.inputs
%legend= t(:ticket_server)
= f.input :ticket_type, :as => :radio_buttons, :collection => Conference::TICKET_TYPES
.actions
= f.button :submit, class: 'primary'
:coffeescript
addColorPickers = ->
......
= semantic_form_for(@conference, :url => conference_path) do |f|
= simple_form_for(@conference, url: conference_path) do |f|
= dynamic_association :days, t(:days), f
= f.buttons do
= f.commit_button :button_html => {:class => "btn primary"}
.actions
= f.button :submit, class: 'primary'
= semantic_form_for(@conference, :url => conference_path) do |f|
= simple_form_for(@conference, url: conference_path) do |f|
= dynamic_association :rooms, t(:rooms), f
= f.buttons do
= f.commit_button :button_html => {:class => "btn primary"}
.actions
= f.button :submit, class: 'primary'