Browse Source

Fixed bugs, restyled pages, and added instructions for admin pages

development
Godwin 8 years ago
parent
commit
30024d86b6
  1. 8
      app/assets/stylesheets/_application.scss
  2. 2
      app/assets/stylesheets/bumbleberry-settings.json
  3. 11
      app/controllers/application_controller.rb
  4. 55
      app/controllers/conferences_controller.rb
  5. 28
      app/helpers/application_helper.rb
  6. 2
      app/views/application/locale_not_available.html.haml
  7. 1
      app/views/conferences/_administration.html.haml
  8. 76
      app/views/conferences/admin/_events.html.haml
  9. 48
      app/views/conferences/admin/_locations.html.haml
  10. 62
      app/views/conferences/admin/_meals.html.haml
  11. 260
      app/views/conferences/admin/_schedule.html.haml
  12. 10
      app/views/conferences/stats.xlsx.haml
  13. 2
      app/views/shared/_footer.html.haml
  14. 263
      config/initializers/i18n.rb
  15. 31
      config/locales/en.yml

8
app/assets/stylesheets/_application.scss

@ -123,6 +123,10 @@ table, .table {
tbody th {
width: 0.1rem;
}
&.admin-edit {
width: 100%;
}
}
.table {
@ -496,7 +500,7 @@ input {
}
.input-field-help {
margin: 0.5em 1em 0;
margin: 0.5em 1em;
line-height: 1.3333em;
font-size: 1.125em;
}
@ -760,6 +764,7 @@ form {
#main .columns td.form,
#main .columns .table-td.form {
border: 0;
width: 1px;
form {
margin: 0;
@ -768,6 +773,7 @@ form {
button {
display: block;
width: 100%;
white-space: nowrap;
+ button {
margin-top: 0.5em;

2
app/assets/stylesheets/bumbleberry-settings.json

@ -6,7 +6,7 @@
},
"development": {
"and_chr": ["51"],
"chrome": ["51"],
"chrome": ["52"],
"edge": ["13"],
"firefox": ["44"],
"ie": ["11"],

11
app/controllers/application_controller.rb

@ -201,7 +201,7 @@ class ApplicationController < LinguaFrancaApplicationController
params[:_original_action] = params[:action]
params[:action] = 'error-locale-not-available'
@page_title = 'page_titles.404.Locale_Not_Available'
@main_title_vars = { vars: { language: view_context.language(locale) } }
@main_title_vars = { vars: { language: view_context.language_name(locale) } }
@main_title = 'error.locale_not_available.title'
render 'application/locale_not_available', status: 404
end
@ -507,7 +507,7 @@ class ApplicationController < LinguaFrancaApplicationController
if @schedule[day].present? && @schedule[day][:times].present? && @schedule[day][:times][block['time'].to_f].present?
@schedule[day][:times][block['time'].to_f][:item][:workshops][workshop.event_location_id] = { workshop: workshop, status: { errors: [], warnings: [], conflict_score: nil } }
@schedule[day][:locations][workshop.event_location_id] ||= workshop.event_location
@schedule[day][:locations][workshop.event_location_id] ||= workshop.event_location if workshop.event_location.present?
end
end
end
@ -613,18 +613,19 @@ class ApplicationController < LinguaFrancaApplicationController
end
end
location = workshop_i.event_location || EventLocation.new
needs = JSON.parse(workshop_i.needs || '[]').map &:to_sym
amenities = JSON.parse(workshop_i.event_location.amenities || '[]').map &:to_sym
amenities = JSON.parse(location.amenities || '[]').map &:to_sym
needs.each do | need |
@schedule[day][:times][time][:item][:workshops][ids[i]][:status][:errors] << {
name: :need_not_available,
need: need,
location: workshop_i.event_location,
location: location,
workshop: workshop_i,
i18nVars: {
need: need.to_s,
location: workshop_i.event_location.title,
location: location.title,
workshop_title: workshop_i.title
}
} unless amenities.include? need

55
app/controllers/conferences_controller.rb

@ -267,6 +267,7 @@ class ConferencesController < ApplicationController
when :policy
@page_title = 'articles.conference_registration.headings.Policy_Agreement'
when :administration
@warnings << flash[:error] if flash[:error].present?
@admin_step = params[:admin_step] || 'edit'
return do_404 unless view_context.valid_admin_steps.include?(@admin_step.to_sym)
@page_title = 'articles.conference_registration.headings.Administration'
@ -336,7 +337,7 @@ class ConferencesController < ApplicationController
],
column_types: {
name: :bold,
date: :date,
#date: :date,
arrival: [:date, :day],
departure: [:date, :day],
registration_fees_paid: :money
@ -360,7 +361,6 @@ class ConferencesController < ApplicationController
},
data: []
}
#@registrations.sort_by! { |a, b| a.title.downcase <=> b.title.downcase }
@registrations.each do | r |
user = r.user_id ? User.where(id: r.user_id).first : nil
if user.present?
@ -378,14 +378,15 @@ class ConferencesController < ApplicationController
end
end
steps = r.steps_completed || []
@excel_data[:data] << {
name: user.firstname || '',
email: user.email || '',
status: (view_context._"articles.conference_registration.terms.registration_status.#{(steps.include? 'questions') ? 'registered' : ((steps.include? 'contact_info') ? 'preregistered' : 'unregistered')}"),
date: r.created_at ? r.created_at.strftime("%F %T") : '',
date: r.created_at,# ? r.created_at.strftime("%F %T") : '',
city: r.city || '',
preferred_language: user.locale.present? ? (view_context.language user.locale) : '',
languages: ((r.languages || []).map { |x| view_context.language x }).join(', ').to_s,
preferred_language: user.locale.present? ? (view_context.language_name user.locale) : '',
languages: ((r.languages || []).map { |x| view_context.language_name x }).join(', ').to_s,
arrival: r.arrival ? r.arrival.strftime("%F %T") : '',
departure: r.departure ? r.departure.strftime("%F %T") : '',
housing: r.housing || '',
@ -619,6 +620,7 @@ class ConferencesController < ApplicationController
end
return redirect_to administration_step_path(@this_conference.slug, :housing)
when 'broadcast'
@hide_description = true
@subject = params[:subject]
@body = params[:body]
@send_to = params[:send_to]
@ -660,11 +662,16 @@ class ConferencesController < ApplicationController
return render 'conferences/register'
when 'save'
location = EventLocation.find_by! id: params[:id].to_i, conference_id: @this_conference.id
location.title = params[:title]
location.address = params[:address]
location.amenities = (params[:needs] || {}).keys.to_json
location.space = params[:space]
location.save!
empty_param = get_empty(params, [:title, :address, :space])
if empty_param.present?
flash[:error] = (view_context._"errors.messages.fields.#{empty_param.to_s}.empty")
else
location.title = params[:title]
location.address = params[:address]
location.amenities = (params[:needs] || {}).keys.to_json
location.space = params[:space]
location.save!
end
return redirect_to administration_step_path(@this_conference.slug, :locations)
when 'cancel'
return redirect_to administration_step_path(@this_conference.slug, :locations)
@ -673,13 +680,18 @@ class ConferencesController < ApplicationController
location.destroy
return redirect_to administration_step_path(@this_conference.slug, :locations)
when 'create'
EventLocation.create(
conference_id: @this_conference.id,
title: params[:title],
address: params[:address],
amenities: (params[:needs] || {}).keys.to_json,
space: params[:space]
)
empty_param = get_empty(params, [:title, :address, :space])
if empty_param.present?
flash[:error] = (view_context._"errors.messages.fields.#{empty_param.to_s}.empty")
else
EventLocation.create(
conference_id: @this_conference.id,
title: params[:title],
address: params[:address],
amenities: (params[:needs] || {}).keys.to_json,
space: params[:space]
)
end
return redirect_to administration_step_path(@this_conference.slug, :locations)
end
when 'meals'
@ -1444,6 +1456,15 @@ class ConferencesController < ApplicationController
UserMailer.conference_registration_payment_received(@conference, data, registration).deliver
end
def get_empty(hash, keys)
keys = [keys] unless keys.is_a?(Array)
keys.each do | key |
puts " ===== #{key} = #{hash[key]} ===== "
return key unless hash[key].present?
end
return nil
end
def PayPal!
Paypal::Express::Request.new(
username: @this_conference.paypal_username,

28
app/helpers/application_helper.rb

@ -618,6 +618,11 @@ module ApplicationHelper
return hash.length > 1 ? _("geography.formats.#{hash.keys.join('_')}", locale: locale, vars: hash) : hash.values.first
end
def location_link(location)
return '' unless location.present? && location.address.present?
content_tag(:a, (_!location.address), href: "http://www.google.com/maps/place/#{location.latitude},#{location.longitude}")
end
def same_city?(location1, location2)
return false unless location1.present? && location2.present?
@ -651,7 +656,7 @@ module ApplicationHelper
link_to "<span class=\"title\">#{title}</span>".html_safe, link, :class => classes
end
def language(locale, original_language = false)
def language_name(locale, original_language = false)
args = {}
args[:locale] = locale if original_language
_("languages.#{locale}", args)
@ -828,7 +833,11 @@ module ApplicationHelper
end
def location_name(id)
location = EventLocation.find(id)
begin
location = EventLocation.find(id)
rescue
return ''
end
return '' unless location.present?
return location.title
end
@ -1193,6 +1202,9 @@ module ApplicationHelper
end
elsif options[:label] != false
html += label_tag id, (_"forms.labels.generic.#{name}")
elsif options[:type] == :select
# add an empty label so that the drop down button will still appear
html += label_tag id, ''
end
input_options = {
id: id,
@ -1302,18 +1314,26 @@ module ApplicationHelper
values = values.present? ? values.map(&:to_s) : [] unless is_single
boxes = boxes.map(&:to_s)
end
# convert the required value into a pure boolean
required = !!options[:required]
boxes.each do | box |
checked = (is_single ? values.present? : values.include?(box))
values -= [box] if checked && !is_single
id = nil
if options[:radiobuttons].present?
id = unique_id("#{name.to_s}_#{box}")
boxes_html += radio_button_tag(name, box, checked, id: id)
boxes_html += radio_button_tag(name, box, checked, id: id, required: required)
else
_name = (is_single ? name : "#{name.to_s}[#{box}]")
id = unique_id(_name)
boxes_html += check_box_tag(_name, 1, checked, data: { toggles: options[:toggles] }.compact, id: id)
boxes_html += check_box_tag(_name, 1, checked, data: { toggles: options[:toggles] }.compact, id: id, required: required)
end
# we only need the required attribute on one element
required = false
if is_single
label = _(label_key.to_s)
elsif box.is_a?(Integer)

2
app/views/application/locale_not_available.html.haml

@ -5,7 +5,7 @@
%ul.locales
- @alt_lang_urls.each do |locale, url|
%li
- locale_translation = language(locale, true)
- locale_translation = language_name(locale, true)
%a.button{href: url, lang: locale}
=_'translate.content.change_locale', "Read in #{locale_translation}", vars: {language: locale_translation}, locale: locale
%h2= _'error.locale_not_available.volunteer.title'

1
app/views/conferences/_administration.html.haml

@ -2,4 +2,5 @@
= admin_menu
= columns(medium: 9, large: 10) do
%h3.subtitle=_("menu.submenu.admin.#{@admin_step.titlecase.gsub(/\s/, '_')}")
%p=(_"articles.admin.#{@admin_step.gsub(/\s/, '_')}.description", :p) unless @hide_description === true
%div{id: "admin-#{@admin_step}"}= render "conferences/admin/#{@admin_step}"

76
app/views/conferences/admin/_events.html.haml

@ -1,36 +1,42 @@
- if @events.present?
%ul.events.admin-blocks
- @events.each do | event |
%li
%h4.title=event.title
.details
= data_set(:h5, 'forms.labels.generic.event_location', class: :location) do
=event.event_location.present? ? event.event_location.title : ''
= data_set(:h5, 'forms.labels.generic.day', class: :day) do
= date(event.start_time.to_date, :weekday)
= data_set(:h5, 'forms.labels.generic.time', class: :time) do
= time(event.start_time, :short)
= data_set(:h5, 'forms.labels.generic.time_span', class: 'time-span') do
= hours(event.start_time, event.end_time)
= form_tag administration_update_path(@this_conference.slug, :events), class: [:actions, :fill] do
= hidden_field_tag :id, event.id
= button_with_confirmation :delete, (_'modals.admin.generic.delete.confirm', :p, vars: { title: event.title }), value: :delete, class: [:delete, :small]
= button_tag :edit, value: :edit, class: [:small]
- if @this_conference.event_locations.blank?
.warning-info=_'articles.admin.events.no_locations_warning'
- else
- if @events.present?
%table.events.admin-edit
%tr
%th=_'forms.labels.generic.title'
%th=_'forms.labels.generic.event_location'
%th=_'forms.labels.generic.day'
%th=_'forms.labels.generic.time'
%th=_'forms.labels.generic.time_span'
%th.form
- @events.each do | event |
%tr
%th=event.title
%td=_!(event.event_location.present? ? event.event_location.title : '')
%td=date(event.start_time.to_date, :weekday)
%td=time(event.start_time, :short)
%td=hours(event.start_time, event.end_time)
%td.form
= form_tag administration_update_path(@this_conference.slug, :events) do
= hidden_field_tag :id, event.id
= button_tag :edit, value: :edit, class: :small
= button_with_confirmation :delete, (_'modals.admin.generic.delete.confirm', :p, vars: { title: event.title }), value: :delete, class: [:delete, :small]
%h4=_"articles.admin.locations.headings.#{@event.id.present? ? 'edit' : 'add'}_event", :t
= form_tag administration_update_path(@this_conference.slug, :events) do
= hidden_field_tag :id, @event.id if @event.id.present?
= textfield :title, @event.title!, required: true, big: true, lang: @event.locale
= textarea :info, @event.info!, heading: 'articles.conference_registration.headings.admin.edit.info', help: 'articles.conference_registration.paragraphs.admin.edit.info', lang: @event.locale, edit_on: :focus
.flex-inputs
= location_select @event.event_location_id, small: true, stretch: true
= day_select @day, small: true, format: :weekday
= time_select @time, small: true
= length_select @length, small: true
- I18n.backend.enabled_locales.each do | locale |
- if locale.to_s != @event.locale.to_s
= textfield "title_translations[#{locale.to_s}]", @event._title(locale), big: true, heading: 'translate.pages.Locale_Translation', vars: { language: _("languages.#{locale}") }, label: 'forms.labels.generic.title', lang: locale
= textarea "info_translations[#{locale.to_s}]", @event._info(locale), lang: locale, label: 'forms.labels.generic.info', edit_on: :focus
.actions.next-prev
= button_tag :save, value: :save
= button_tag :cancel, value: :cancel, class: :subdued, formnovalidate: true if @event.id.present?
%h4=_"articles.admin.locations.headings.#{@event.id.present? ? 'edit' : 'add'}_event", :t
= form_tag administration_update_path(@this_conference.slug, :events) do
= hidden_field_tag :id, @event.id if @event.id.present?
= textfield :title, @event.title!, required: true, big: true, lang: @event.locale
= textarea :info, @event.info!, heading: 'articles.conference_registration.headings.admin.edit.info', help: 'articles.conference_registration.paragraphs.admin.events.info', lang: @event.locale, edit_on: :focus
.flex-inputs
= location_select @event.event_location_id, small: true, stretch: true
= day_select @day, small: true, format: :weekday
= time_select @time, small: true
= length_select @length, small: true
- I18n.backend.enabled_locales.each do | locale |
- if locale.to_s != @event.locale.to_s
= textfield "title_translations[#{locale.to_s}]", @event._title(locale), big: true, heading: 'translate.pages.Locale_Translation', vars: { language: _("languages.#{locale}") }, label: 'forms.labels.generic.title', lang: locale
= textarea "info_translations[#{locale.to_s}]", @event._info(locale), lang: locale, label: 'forms.labels.generic.info', edit_on: :focus
.actions.next-prev
= button_tag :save, value: :save
= button_tag :cancel, value: :cancel, class: :subdued, formnovalidate: true if @event.id.present?

48
app/views/conferences/admin/_locations.html.haml

@ -1,32 +1,34 @@
- unless @location.present?
%ul.locations.admin-blocks
- @locations.each do | location |
%li
%h4.title=location.title
.details
= data_set(:h5, 'forms.labels.generic.address', class: :address) do
=location.address
= data_set(:h5, 'articles.workshops.headings.space', class: :space) do
= _"workshop.options.space.#{location.space}"
- amenities = location.amenities.present? ? JSON.parse(location.amenities) : []
- if amenities.present?
= data_set(:h5, 'articles.admin.locations.headings.amenities', class: :amenities) do
%ul.amenities
- amenities.each do | amenity |
%li=_"workshop.options.needs.#{amenity}"
= form_tag administration_update_path(@this_conference.slug, :locations), class: [:actions, :fill] do
= hidden_field_tag :id, location.id
= button_tag :edit, value: :edit, class: :small
= button_with_confirmation :delete, (_'modals.admin.generic.delete.confirm', :p, vars: { title: location.title }), value: :delete, class: [:delete, :small]
- if @locations.present?
%table.locations.admin-edit
%tr
%th=_'forms.labels.generic.title'
%th=_'forms.labels.generic.address'
%th=_'articles.workshops.headings.space'
%th=_'articles.admin.locations.headings.amenities'
%th.form
- @locations.each do | location |
%tr
%th=_!(location.title || '')
%td=location_link location
%td=location.space.present? ? (_"workshop.options.space.#{location.space}") : ''
%td
- amenities = location.amenities.present? ? JSON.parse(location.amenities) : []
=_!(amenities.collect { |amenity| _"workshop.options.needs.#{amenity}" }).join(', ')
%td.form
= form_tag administration_update_path(@this_conference.slug, :locations) do
= hidden_field_tag :id, location.id
= button_tag :edit, value: :edit, class: :small
= button_with_confirmation :delete, (_'modals.admin.generic.delete.confirm', :p, vars: { title: location.title }), value: :delete, class: [:delete, :small]
%h4=_"articles.admin.locations.headings.#{@location.present? ? 'edit' : 'add'}_location", :t
= form_tag administration_update_path(@this_conference.slug, :locations) do
= hidden_field_tag :id, @location.id if @location.present?
= textfield :title, @location.present? ? @location.title : nil, required: true, big: true
= textfield :address, @location.present? ? @location.address : nil, required: true
= textfield :title, @location.present? ? @location.title : nil, required: true, big: true, help: 'articles.admin.locations.paragraphs.title'
= textfield :address, @location.present? ? @location.address : nil, required: true, help: 'articles.admin.locations.paragraphs.address'
= columns(medium: 6) do
= radiobuttons :space, EventLocation.all_spaces, @location.present? ? @location.space : nil, 'workshop.options.space', vertical: true, heading: 'articles.workshops.headings.space'
= radiobuttons :space, EventLocation.all_spaces, @location.present? ? @location.space : nil, 'workshop.options.space', vertical: true, heading: 'articles.workshops.headings.space', required: true, help: 'articles.admin.locations.paragraphs.space'
= columns(medium: 6) do
= checkboxes :needs, EventLocation.all_amenities, @location.present? ? JSON.parse(@location.amenities) : [], 'workshop.options.needs', vertical: true, heading: 'articles.admin.locations.headings.amenities'
= checkboxes :needs, EventLocation.all_amenities, @location.present? ? JSON.parse(@location.amenities) : [], 'workshop.options.needs', vertical: true, heading: 'articles.admin.locations.headings.amenities', help: 'articles.admin.locations.paragraphs.amenities'
.actions.next-prev
- if @location.present?
= button_tag :save, value: :save

62
app/views/conferences/admin/_meals.html.haml

@ -1,30 +1,34 @@
- if @this_conference.meals.present?
%table.meals
%tr
%th=_'forms.labels.generic.title'
%th=_'forms.labels.generic.info'
%th=_'forms.labels.generic.event_location'
%th=_'forms.labels.generic.day'
%th=_'forms.labels.generic.time'
%th.form
- @meals.each do | time, meal |
- if @this_conference.event_locations.present?
- if @this_conference.meals.present?
%table.meals.admin-edit
%tr
%th
=_!(meal['title'] || '')
%td=_!(meal['info'] || '')
%td=_!location_name(meal['location'].to_i)
%td=date(meal['day'], :weekday)
%td=time(meal['time'].to_f)
%td.form
= form_tag administration_update_path(@this_conference.slug, :meals) do
= hidden_field_tag :meal, time
= button_tag :delete, value: :delete, class: [:small, :delete]
= form_tag administration_update_path(@this_conference.slug, :meals) do
.flex-inputs
= location_select nil, small: true, stretch: true
= day_select nil, small: true, format: :weekday
= time_select nil, small: true
= textfield :title, nil, required: true, big: true
= textfield :info, nil
.actions.next-prev
= button_tag :add_meal, value: :add_meal
%th=_'forms.labels.generic.title'
%th=_'forms.labels.generic.info'
%th=_'forms.labels.generic.event_location'
%th=_'forms.labels.generic.day'
%th=_'forms.labels.generic.time'
%th.form
- @meals.each do | time, meal |
%tr
%th
=_!(meal['title'] || '')
%td=_!(meal['info'] || '')
%td=_!location_name(meal['location'].to_i)
%td=date(meal['day'], :weekday)
%td=time(meal['time'].to_f)
%td.form
= form_tag administration_update_path(@this_conference.slug, :meals) do
= hidden_field_tag :meal, time
= button_tag :delete, value: :delete, class: [:small, :delete]
= form_tag administration_update_path(@this_conference.slug, :meals) do
%h4=_'articles.admin.locations.headings.add_meal', :t
.flex-inputs
= location_select nil, small: true, stretch: true
= day_select nil, small: true, format: :weekday
= time_select nil, small: true
= textfield :title, nil, required: true, big: true, help: 'articles.admin.locations.paragraphs.meal_title'
= textfield :info, nil, help: 'articles.admin.locations.paragraphs.meal_info'
.actions.next-prev
= button_tag :add_meal, value: :add_meal
- else
.warning-info=_'articles.admin.meals.no_locations_warning'

260
app/views/conferences/admin/_schedule.html.haml

@ -1,134 +1,136 @@
- conference = @this_conference || @conference
- if @entire_page
= form_tag administration_update_path(conference.slug, :schedule) do
- if conference.workshop_schedule_published
%p=_'articles.conference_registration.paragraphs.admin.schedule.published', :p
.actions= button_tag :un_publish, value: :publish, class: :delete
- else
%p=_'articles.conference_registration.paragraphs.admin.schedule.un_published', :p
.actions= button_tag :publish, value: :publish
- if conference.event_locations.blank? && @entire_page
.warning-info=_'articles.admin.schedule.no_locations_warning'
- else
- if @entire_page
= form_tag administration_update_path(conference.slug, :schedule) do
- if conference.workshop_schedule_published
%p=_'articles.conference_registration.paragraphs.admin.schedule.published', :p
.actions= button_tag :un_publish, value: :publish, class: :delete
- else
%p=_'articles.conference_registration.paragraphs.admin.schedule.un_published', :p
.actions= button_tag :publish, value: :publish
#schedule-preview
- @schedule.each do | day, data |
%h4=date(day, :weekday)
%table.schedule{class: [data[:locations].present? ? 'has-locations' : 'no-locations', "locations-#{data[:locations].size}"]}
- if data[:locations].present?
%thead
%tr
%th.corner
- data[:locations].each do | id, location |
%th=location.title
%th.status
%tbody
- data[:times].each do | time, time_data |
%tr
- rowspan = (time_data[:length] * 2).to_i
%th=time(time)
- if time_data[:type] == :workshop
- if time_data[:item][:workshops].present?
- data[:locations].each do | id, location |
- if time_data[:item][:workshops][id].present?
- workshop = time_data[:item][:workshops][id][:workshop]
- status = time_data[:item][:workshops][id][:status]
- else
- workshop = status = nil
%td{class: [time_data[:type], workshop.present? ? :filled : nil], rowspan: rowspan}
- if workshop.present?
= link_to off_screen(workshop.title), view_workshop_path(@conference.slug, workshop.id), class: 'event-detail-link'
%template.event-details{data: { href: view_workshop_path(@conference.slug, workshop.id) }}
%h1.title=workshop.title
%p.address
= workshop.event_location.title + _!(': ')
%a{ href: "http://www.google.com/maps/place/#{workshop.event_location.latitude},#{workshop.event_location.longitude}" }
= workshop.event_location.address
.workshop-description= richtext workshop.info, 1
.title=workshop.title
- if @can_edit
= form_tag administration_update_path(conference.slug, :schedule), class: 'js-xhr' do
.status
.conflict-score
%span.title Conflict Score:
%span.value="#{status[:conflict_score] * 100.0}%"
- if status[:errors].present?
.errors
- status[:errors].each do | error |
.error=_"errors.messages.schedule.#{error[:name].to_s}", vars: error[:i18nVars]
= hidden_field_tag :id, workshop.id
= button_tag :deschedule, value: :deschedule_workshop, class: [:delete, :small]
- elsif @can_edit
#schedule-preview
- @schedule.each do | day, data |
%h4=date(day, :weekday)
%table.schedule{class: [data[:locations].present? ? 'has-locations' : 'no-locations', "locations-#{data[:locations].size}"]}
- if data[:locations].present?
%thead
%tr
%th.corner
- data[:locations].each do | id, location |
%th=location.title
%th.status
%tbody
- data[:times].each do | time, time_data |
%tr
- rowspan = (time_data[:length] * 2).to_i
%th=time(time)
- if time_data[:type] == :workshop
- if time_data[:item][:workshops].present?
- data[:locations].each do | id, location |
- if time_data[:item][:workshops][id].present?
- workshop = time_data[:item][:workshops][id][:workshop]
- status = time_data[:item][:workshops][id][:status]
- else
- workshop = status = nil
%td{class: [time_data[:type], workshop.present? ? :filled : nil], rowspan: rowspan}
- if workshop.present? && workshop.event_location.present?
= link_to off_screen(workshop.title), view_workshop_path(@conference.slug, workshop.id), class: 'event-detail-link'
%template.event-details{data: { href: view_workshop_path(@conference.slug, workshop.id) }}
%h1.title=workshop.title
%p.address
= workshop.event_location.title + _!(': ')
= location_link workshop.event_location
.workshop-description= richtext workshop.info, 1
.title=workshop.title
- if @can_edit
= form_tag administration_update_path(conference.slug, :schedule), class: 'js-xhr' do
.status
.conflict-score
%span.title Conflict Score:
%span.value="#{status[:conflict_score] * 100.0}%"
- if status[:errors].present?
.errors
- status[:errors].each do | error |
.error=_"errors.messages.schedule.#{error[:name].to_s}", vars: error[:i18nVars]
= hidden_field_tag :id, workshop.id
= button_tag :deschedule, value: :deschedule_workshop, class: [:delete, :small]
- elsif @can_edit
.title="Block #{time_data[:item][:block] + 1}"
- else
%td{class: time_data[:type], rowspan: rowspan, colspan: data[:locations].present? ? data[:locations].size : 1}
- if @can_edit
.title="Block #{time_data[:item][:block] + 1}"
- else
%td.status{rowspan: rowspan}
- if time_data[:status].present? && time_data[:status][:errors].present?
%ul.errors
- time_data[:status][:errors].each do | error |
%li=error.to_json.to_s
- elsif time_data[:type] != :nil
%td{class: time_data[:type], rowspan: rowspan, colspan: data[:locations].present? ? data[:locations].size : 1}
- if @can_edit
.title="Block #{time_data[:item][:block] + 1}"
%td.status{rowspan: rowspan}
- if time_data[:status].present? && time_data[:status][:errors].present?
%ul.errors
- time_data[:status][:errors].each do | error |
%li=error.to_json.to_s
- elsif time_data[:type] != :nil
%td{class: time_data[:type], rowspan: rowspan, colspan: data[:locations].present? ? data[:locations].size : 1}
- case time_data[:type]
- when :meal
%a.event-detail-link=off_screen(time_data[:item]['title'])
- location = EventLocation.find(time_data[:item]['location'].to_i)
%template.event-details
%h1.title=time_data[:item]['title']
%p.address
= location.title + _!(': ')
%a{ href: "http://www.google.com/maps/place/#{location.latitude},#{location.longitude}" }
= location.address
.title= time_data[:item]['title']
.location= location.title
- when :event
%a.event-detail-link=off_screen(time_data[:item][:title])
%template.event-details
%h1.title=time_data[:item][:title]
%p.address
= time_data[:item].event_location.title + _!(': ')
%a{ href: "http://www.google.com/maps/place/#{time_data[:item].event_location.latitude},#{time_data[:item].event_location.longitude}" }
= time_data[:item].event_location.address
= richtext time_data[:item][:info], 1
.title= time_data[:item][:title]
.location= time_data[:item].event_location.title
%td.status{rowspan: rowspan}
- if @entire_page
%ul.workshops-to-schedule
- @workshops.each do | workshop |
%li{id: "workshop-#{workshop.id}", class: workshop.block.present? ? 'booked' : 'not-booked'}
%h4.title= workshop.title
= form_tag administration_update_path(conference.slug, :schedule), class: 'js-xhr' do
.already-booked
.field-error='This block is already booked'
.workshop-description
.details
= data_set(:h5, 'articles.workshops.headings.interested_count') do
= workshop.interested_count
= data_set(:h5, 'articles.workshops.headings.facilitators') do
- facilitators = []
- workshop.active_facilitators.each do | facilitator |
- facilitators << facilitator.name
= facilitators.join ', '
= data_set(:h5, 'articles.workshops.headings.needs') do
- needs = []
- JSON.parse(workshop.needs || '[]').each do | need |
- needs << (_"workshop.options.needs.#{need}")
= _!(needs.join ', ')
= data_set(:h5, 'articles.workshops.headings.theme') do
= workshop.theme.present? ? (_"workshop.options.theme.#{workshop.theme}") : ''
= data_set(:h5, 'articles.workshops.headings.space') do
= workshop.space.present? ? (_"workshop.options.space.#{workshop.space}") : ''
= data_set(:h5, 'forms.labels.generic.info') do
= link_info_dlg truncate(workshop.info), (richtext workshop.info.html_safe), workshop.title
- if workshop.notes.present? && strip_tags(workshop.notes).length > 0
= data_set(:h5, 'forms.labels.generic.notes') do
= link_info_dlg truncate(workshop.notes), (richtext workshop.notes.html_safe), workshop.title
- case time_data[:type]
- when :meal
- location = EventLocation.where(id: time_data[:item]['location'].to_i).first
- if location.present?
%a.event-detail-link=off_screen(time_data[:item]['title'])
%template.event-details
%h1.title=time_data[:item]['title']
%p.address
= location.title + _!(': ')
= location_link location
.title= time_data[:item]['title']
.location= location.title
- when :event
- if time_data[:item].event_location.present?
%a.event-detail-link=off_screen(time_data[:item][:title])
%template.event-details
%h1.title=time_data[:item][:title]
%p.address
= time_data[:item].event_location.title + _!(': ')
= location_link time_data[:item].event_location
= richtext time_data[:item][:info], 1
.title= time_data[:item][:title]
.location= time_data[:item].event_location.title
%td.status{rowspan: rowspan}
- if @entire_page
%ul.workshops-to-schedule
- @workshops.each do | workshop |
%li{id: "workshop-#{workshop.id}", class: workshop.block.present? ? 'booked' : 'not-booked'}
%h4.title= workshop.title
= form_tag administration_update_path(conference.slug, :schedule), class: 'js-xhr' do
.already-booked
.field-error='This block is already booked'
.workshop-description
.details
= data_set(:h5, 'articles.workshops.headings.interested_count') do
= workshop.interested_count
= data_set(:h5, 'articles.workshops.headings.facilitators') do
- facilitators = []
- workshop.active_facilitators.each do | facilitator |
- facilitators << facilitator.name
= facilitators.join ', '
= data_set(:h5, 'articles.workshops.headings.needs') do
- needs = []
- JSON.parse(workshop.needs || '[]').each do | need |
- needs << (_"workshop.options.needs.#{need}")
= _!(needs.join ', ')
= data_set(:h5, 'articles.workshops.headings.theme') do
= workshop.theme.present? ? (_"workshop.options.theme.#{workshop.theme}") : ''
= data_set(:h5, 'articles.workshops.headings.space') do
= workshop.space.present? ? (_"workshop.options.space.#{workshop.space}") : ''
= data_set(:h5, 'forms.labels.generic.info') do
= link_info_dlg truncate(workshop.info), (richtext workshop.info.html_safe), workshop.title
- if workshop.notes.present? && strip_tags(workshop.notes).length > 0
= data_set(:h5, 'forms.labels.generic.notes') do
= link_info_dlg truncate(workshop.notes), (richtext workshop.notes.html_safe), workshop.title
= hidden_field_tag :id, workshop.id
.drop-downs
= location_select workshop.event_location_id, small: true
= block_select workshop.block.present? ? "#{workshop.block['day']}:#{workshop.block['block']}" : nil, small: true
.actions.next-prev
= button_tag :deschedule, value: :deschedule_workshop, class: [:delete, 'booked-only', :small]
= button_tag :reschedule, value: :schedule_workshop, class: [:secondary, 'booked-only', :small]
= button_tag :schedule_workshop, value: :schedule_workshop, class: ['not-booked-only', :small]
= hidden_field_tag :id, workshop.id
.drop-downs
= location_select workshop.event_location_id, small: true
= block_select workshop.block.present? ? "#{workshop.block['day']}:#{workshop.block['block']}" : nil, small: true
.actions.next-prev
= button_tag :deschedule, value: :deschedule_workshop, class: [:delete, 'booked-only', :small]
= button_tag :reschedule, value: :schedule_workshop, class: [:secondary, 'booked-only', :small]
= button_tag :schedule_workshop, value: :schedule_workshop, class: ['not-booked-only', :small]

10
app/views/conferences/stats.xlsx.haml

@ -13,9 +13,9 @@
- format_xls 'table' do
- workbook use_autowidth: true
- format bg_color: '333333'
- format 'td', font_name: 'Calibri', bg_color: 'ffffff', fg_color: '333333'
- format 'td', font_name: 'Calibri', fg_color: '333333'
- format 'th', font_name: 'Calibri', b: true, bg_color: '333333', fg_color: 'ffffff'
- format 'td.date', num_fmt: 22, font_name: 'Courier New', sz: 10, bg_color: 'ffffff', fg_color: '333333'
- format 'td.date.day', num_fmt: 14, font_name: 'Courier New', sz: 10, bg_color: 'ffffff', fg_color: '333333'
- format 'td.money', num_fmt: 2, font_name: 'Courier New', sz: 10, bg_color: 'ffffff', fg_color: '333333'
- format 'td.bold', font_name: 'Calibri', bg_color: 'ffffff', fg_color: '333333', b: true
- format 'td.date', num_fmt: 22, font_name: 'Courier New', sz: 10, fg_color: '333333'
- format 'td.date.day', num_fmt: 14, font_name: 'Courier New', sz: 10, fg_color: '333333'
- format 'td.money', num_fmt: 2, font_name: 'Courier New', sz: 10, fg_color: '333333'
- format 'td.bold', font_name: 'Calibri', fg_color: '333333', b: true

2
app/views/shared/_footer.html.haml

@ -17,7 +17,7 @@
%ul.locales
- @alt_lang_urls.each do |locale, url|
%li
- locale_translation = language(locale, true)
- locale_translation = language_name(locale, true)
%a{href: url, lang: locale}
=_'translate.content.change_locale', "Read in #{locale_translation}", vars: {language: locale_translation}, locale: locale if locale != I18n.locale.to_s
.site-info

263
config/initializers/i18n.rb

@ -1,263 +0,0 @@
# require 'i18n/backend/active_record'
# require 'yaml'
# if Rails.env.test?
# class DevTranslation < Translation
# self.table_name = 'translations'
# establish_connection :development
# end
# end
# module I18n
# class MissingTranslationExceptionHandler < ExceptionHandler
# def self.lorem_ipsum(method, size)
# options = {:random => true}
# case method.to_s
# when 'c', 'char', 'character', 'characters'
# if size
# return (Forgery::LoremIpsum.characters size, options).capitalize
# end
# return Forgery::LoremIpsum.character, options
# when 'w', 'word', 'words'
# if size
# return (Forgery::LoremIpsum.words size, options).capitalize
# end
# #return'LOREM'
# return (Forgery::LoremIpsum.word options).capitalize
# when 's', 'sentence', 'sentences'
# if size
# return Forgery::LoremIpsum.sentences size, options
# end
# return (Forgery::LoremIpsum.sentence options).capitalize
# when 'p', 'paragraph', 'paragraphs'
# if size
# return Forgery::LoremIpsum.paragraphs size, options.merge({:sentences => 10})
# end
# return Forgery::LoremIpsum.sentences 10, options
# when 't', 'title'
# return (Forgery::LoremIpsum.sentences 1, options).capitalize
# end
# return method
# end
# def self.note(key, behavior = nil, behavior_size = nil)
# I18n.backend.needs_translation(key)
# if behavior
# if behavior.to_s == 'strict'
# return nil
# end
# return self.lorem_ipsum(behavior, behavior_size)
# end
# #key.to_s.gsub(/^world\..*\.(.+)\.name$/, '\1').gsub(/^.*\.(.+)?$/, '\1').gsub('_', ' ')
# key.to_s.gsub(/^world\.(.+)\.name$/, '\1').gsub(/^.*\.(.+)?$/, '\1').gsub('_', ' ')
# end
# def call(exception, locale, key, options)
# if exception.is_a?(MissingTranslation)
# I18n::MissingTranslationExceptionHandler.note(key, options[:behavior] || nil, options[:behavior_size] || nil)
# else
# super
# end
# end
# end
# module Backend
# class BikeBike < I18n::Backend::ActiveRecord
# @@needs_translation
# @@translations_file = 'config/locales/translation-info.yml'
# @@translation_cache_file = 'config/locales/.translation-cache.yml'
# @@pluralization_rules_file = 'config/locales/pluralization-rules.yml'
# @@translation_cache
# @@testing_started = false
# @@hosts
# def self.init_tests!(new_translations = nil)
# if Rails.env.test?
# if !@@testing_started
# @@testing_started = true
# File.open(@@translations_file, 'w+')
# File.open(@@translation_cache_file, 'w+')
# end
# if !new_translations.nil?
# record_translation(new_translations)
# end
# end
# end
# def needs_translation(key)
# @@needs_translation ||= Array.new
# @@needs_translation << key
# end
# def translate_control(translation)
# @@translationsOnThisPage = true
# datakeys = ''
# translation['vars'].each { |key, value| datakeys += ' data-var-' + key.to_s + '="' + value.to_s.gsub('"', '&quot;') + '"' }
# ('<span class="translate-me ' + (translation['is_translated'] ? '' : 'un') + 'translated lang-' + (translation['lang']) + ' key--' + translation['key'].gsub('.', '--') + '" data-translate-key="' + translation['key'] + '" data-translate-untranslated="' + translation['untranslated'].gsub('"', '&quot;') + (translation['translated'] ? '" data-translate-translated="' + translation['translated'] : '') + '" data-vars="' + (translation['vars'].length ? translation['vars'].to_json.gsub('"', '&quot;') : '') + '" title="' + ('translate.alt_click') + '">' + (translation['html'] || translation['untranslated']) + '</span>').to_s.html_safe
# end
# def initialized?
# begin
# super
# rescue
# return false
# end
# end
# def initialize
# if !File.exist?(@@translation_cache_file)
# File.open(@@translation_cache_file, 'w+')
# end
# @@translation_cache = YAML.load(File.read(@@translation_cache_file)) || Hash.new
# super
# end
# def get_translation_info()
# begin
# YAML.load_file(@@translations_file) || {}
# rescue Exception => e
# # sometimes concurrency issues cause an exception during testing
# sleep(1/2.0)
# get_translation_info()
# end
# end
# def get_pluralization_rules(locale)
# rules = YAML.load_file(@@pluralization_rules_file)
# rules[locale.to_sym]
# end
# def get_language_codes()
# YAML.load_file(@@pluralization_rules_file).keys
# end
# def set_locale(host)
# @@hosts ||= Hash.new
# default = I18n.default_locale.to_s
# lang = @@hosts[host]
# if lang === false
# lang = nil
# elsif lang.nil?
# if (lang = host.gsub(/^(dev|test|www)[\-\.](.*)$/, '\2').gsub(/^(([^\.]+)\.)?[^\.]+\.[^\.]+$/, '\2')).blank? || (host == "localhost")
# lang = default
# end
# if get_language_codes().include? lang
# if !language_enabled? lang
# I18n.locale = default
# return lang
# end
# else
# lang = nil
# end
# end
# I18n.locale = default unless lang.present?
# # return nil if the language doesn exist, false if it is not enabled, or the code if it is enabled
# lang.present? ? true : false
# end
# def get_language_completion(lang)
# total = 0
# complete = 0
# get_translation_info().each { |k,v|
# total += 1
# complete += v['languages'].include?(lang.to_s) ? 1 : 0
# }
# (total ? complete / total.to_f : 0.0) * 100.0
# end
# def language_enabled?(lang)
# lang.to_s == I18n.default_locale.to_s || get_language_completion(lang) > 66
# end
# def request_translation(key, vars, options)
# locale = options[:locale].to_s
# options[:locale] = :en
# translation = I18n.translate(key, vars, options)
# result = JSON.load(open("http://translate.google.com/translate_a/t?client=t&text=#{URI::escape(translation)}&hl=en&sl=en&tl=#{locale}&ie=UTF-8&oe=UTF-8&multires=1&otf=1&ssel=3&tsel=3&sc=1").read().gsub(/,+/, ',').gsub(/\[,+/, '[').gsub(/,+\]/, ']'))
# while result.is_a?(Array)
# result = result[0]
# end
# return result
# end
# def record_translation(key)
# translations = get_translation_info()
# translations ||= Hash.new
# if key.is_a(Array)
# key.each { |k| translations[k.to_s] ||= Hash.new }
# else
# translations[key.to_s] ||= Hash.new
# end
# File.open(@@translations_file, 'w') { |f| f.write translations.to_yaml }
# end
# protected
# def lookup(locale, key, scope = [], options = {})
# result = nil
# if key.is_a?(String)
# key = key.gsub(/(^\[|\])/, '').gsub(/\[/, '.')
# end
# if @@translation_cache && @@translation_cache.has_key?(locale.to_s) && @@translation_cache[locale.to_s].has_key?(key.to_s)
# result = @@translation_cache[locale.to_s][key.to_s]
# end
# if !result
# result = super(locale, key, scope, options)
# if Rails.env.test? && options[:behavior].to_s != 'scrict'
# if result
# @@translation_cache[locale.to_s] ||= Hash.new
# @@translation_cache[locale.to_s][key.to_s] = result
# File.open(@@translation_cache_file, 'w') { |f| f.write @@translation_cache.to_yaml }
# end
# translations = get_translation_info()
# translations ||= Hash.new
# translations[key.to_s] ||= Hash.new
# translations[key.to_s]['languages'] ||= Array.new
# translations[key.to_s]['pages'] ||= Array.new
# if options['behavior']
# translations[key.to_s]['behavior'] ||= options['behavior']
# end
# vars = []
# options.each { |o,v|
# if !I18n::RESERVED_KEYS.include?(o.to_sym) && o.to_s != 'behavior' && o.to_s != 'behavior_size'
# vars << o.to_sym
# end
# }
# if vars.size() > 0
# translations[key.to_s]['vars'] = vars
# end
# unless translations[key.to_s].has_key?('data')
# translations[key.to_s]['data'] = Array.new
# DevTranslation.where("key = '#{key.to_s}' OR key LIKE '#{key.to_s}#{I18n::Backend::Flatten::FLATTEN_SEPARATOR}%'").each { |t|
# translations[key.to_s]['data'] << ActiveSupport::JSON.encode(t.becomes(Translation))
# unless translations[key.to_s]['languages'].include?(t.locale.to_s)
# translations[key.to_s]['languages'] << t.locale.to_s
# end
# }
# end
# path = $page_info[:path]
# route = nil
# Rails.application.routes.routes.each { |r|
# if !route && r.path.match(path)
# route = r.path.spec.to_s.gsub(/\s*\(\.:\w+\)\s*$/, '')
# end
# }
# unless translations[key.to_s]['pages'].include?(route)
# translations[key.to_s]['pages'] << route
# end
# File.open(@@translations_file, 'w') { |f| f.write translations.to_yaml }
# end
# end
# result
# end
# end
# end
# end
# I18n.exception_handler = I18n::MissingTranslationExceptionHandler.new

31
config/locales/en.yml

@ -163,6 +163,10 @@ en:
unknown: 'Please include your city or town, we could not find a locality from "%{value}"'
name:
empty: 'Please enter a valid name'
address:
empty: 'Please enter an address'
space:
empty: 'Please select a space'
template:
body: 'There were problems with the following fields:'
header:
@ -861,6 +865,7 @@ en:
articles:
admin:
stats:
description: On this page you can view a breakdown of the registration process so far as well as download more detailed data in spreadsheets.
headings:
bikes: Bikes
donation_count: Number of donations
@ -872,25 +877,49 @@ en:
registrations: Number of registrations
completed_registrations: Number of registrations
incomplete_registrations: Incomplete registrations
meals:
description: On this page you can schedule the meals that you will be serving.
no_locations_warning: Before you can add meals, you must first add locations.
events:
description: On this page you can schedule events. Events are any type of event that isn't a meal or a workshop. You can scheulde group meetings, parties, or group ride for example.
no_locations_warning: Before you can add events, you must first add locations.
schedule:
description: On this page you can schedule workshops and publish your schedule to the front page.
no_locations_warning: Before you can schedule workshops, you must first add locations.
housing:
description: The housing tool can be used to help you set up visitors that have requested to be housed with a host.
headings:
guests: Guests
email: Email
housing: Preference
locations:
description: Locations are used to schedule workshops, events, and meals. Once your schedule is published, users will be able to see the name and address and be given a link to a map so that they can find their way.
headings:
add_event: Add Event
add_location: Add Location
add_meal: Add a Meal
amenities: Amenities
edit_event: Edit Event
edit_location: Edit Location
paragraphs:
title: Give your location a title, for example "The Bike Kitchen" or "Smith Park"
meal_title: Give your meal a title, for example "Breakfast"
meal_info: Describe your meal. This will only be visible to conference hosts.
address: Enter the street address (without the city) of the location
space: The space type will help you to schedule workshops. If workshops will occur in this space, select "Meeting Room", "Repair Space", or "Outdoor Space" as you feel this space best matches. Otherwise select event space.
amenities: Amenities match up to workshop needs. Selecting the amenities will help you match up a workshop with this location when a facilitator has requested a specific amenity.
edit:
description: Edit basic info about your conference. Here you can open or close registration, edit what shows up on the front page, set up your payment details, and add members to your organization so that they can access these pages too.
headings:
host_organizations: Host Organizations
members: Organization Members
paypal_info: PayPal Info
paragraphs:
paypal_info: PayPal info is used for donations and fee payments. You must enter all fields to enable online fee payments, see the <a href="https://developer.paypal.com/docs/classic/api/apiCredentials/#creating-an-api-signature" target="_blank">PayPal API credential guide</a> for more information.
broadcast:
description: The broadcast tool is used to contact users through email. You can send messages en masse to select groups of users.
workshop_times:
description: Before you scheulde workshops, you must first create blocks of time when the workshops will be.
contact:
headings:
contact: Send us a question or a complement
@ -1020,6 +1049,8 @@ en:
test: Please take a look at this preview to ensure that you want to send this email. Clicking ‘Test’ will send the email only to you. Only after that then the email will be set to %{send_to_count} people.
preview: Clicking ‘Send’ will send this message to %{send_to_count} people. Please confirm that you have verified that the test email sent to you is what you want to be sent.
sent: Your message has been sent.
events:
info: Describe your event for anyone attending the conference.
companion: Is there someone who you would like us to ensure that you are housed with?
arrival_and_departure: If you don't need housing, just tell us how long you plan to hang out with Bike!Bike!
host:

Loading…
Cancel
Save