Browse Source

Fixed merge conflicts

development
Godwin 11 years ago
parent
commit
1efe20fe42
  1. 7
      .openshift/action_hooks/start
  2. 4
      .openshift/action_hooks/stop
  3. 2
      Gemfile
  4. 398
      Gemfile.lock
  5. BIN
      app/assets/images/Thumbs.db
  6. 37
      app/assets/javascripts/editor.js.coffee
  7. 2
      app/assets/stylesheets/application.css.scss
  8. 5
      app/assets/stylesheets/foundation_and_overrides.scss
  9. 110
      app/assets/stylesheets/sass/_base.scss
  10. 11
      app/assets/stylesheets/sass/_layout.scss
  11. 71
      app/assets/stylesheets/sass/_typography.scss
  12. 240
      app/controllers/conferences_controller.rb
  13. 6
      app/controllers/pages_controller.rb
  14. 13
      app/helpers/application_helper.rb
  15. 4
      app/helpers/bike_bike_form_helper.rb
  16. 44
      app/mailers/user_mailer.rb
  17. 12
      app/models/organization.rb
  18. 2
      app/views/conferences/_header.html.haml
  19. 5
      app/views/conferences/_register.html.haml
  20. 3
      app/views/conferences/_register_cancel.html.haml
  21. 3
      app/views/conferences/_register_cancelled.html.haml
  22. 28
      app/views/conferences/_register_new_organization.html.haml
  23. 37
      app/views/conferences/_register_new_workshop.html.haml
  24. 83
      app/views/conferences/_register_organizations.html.haml
  25. 22
      app/views/conferences/_register_primary.html.haml
  26. 34
      app/views/conferences/_register_questions.html.haml
  27. 3
      app/views/conferences/_register_submit.html.haml
  28. 6
      app/views/conferences/_register_thanks.html.haml
  29. 31
      app/views/conferences/_register_volunteer_questions.html.haml
  30. 13
      app/views/conferences/show.html.haml
  31. 23
      app/views/layouts/application.html.haml
  32. 2
      app/views/layouts/fields/_actions.html.haml
  33. 2
      app/views/layouts/fields/_default.html.haml
  34. 6
      app/views/organizations/_mini_preview.html.haml
  35. 1
      app/views/user_mailer/conference_registration_email.text.haml
  36. 2
      config/initializers/i18n.rb
  37. 2
      config/routes.rb
  38. 5
      db/migrate/20140716001857_add_confirmation_token_to_conference_registrations.rb
  39. 5
      db/migrate/20140716002152_add_data_to_conference_registrations.rb
  40. 4
      db/schema.rb
  41. BIN
      public/registration_data/1t3i4wgk5899kx2x/Thumbs.db

7
.openshift/action_hooks/start

@ -1,7 +0,0 @@
#!/bin/bash
# The logic to start up your application should be put in this
# script. The application will work only if it binds to
# $OPENSHIFT_INTERNAL_IP:8080
export PATH=$OPENSHIFT_RUNTIME_DIR/bin:$PATH
cd $OPENSHIFT_REPO_DIR
rails server -b $OPENSHIFT_INTERNAL_IP -p $OPENSHIFT_INTERNAL_PORT -d

4
.openshift/action_hooks/stop

@ -1,4 +0,0 @@
#!/bin/bash
# The logic to stop your application should be put in this script.
kill -9 `ps -ef | grep "rails server" | grep -v grep | awk '{ print $2 }'` > /dev/null 2>&1
exit 0

2
Gemfile

@ -70,6 +70,6 @@ platforms 'mswin', 'mingw' do
end end
group :staging, :production do group :staging, :production do
gem 'unicorn' gem 'unicorn' if !(RbConfig::CONFIG['target_os'] =~ /mswin|mingw|cygwin/i)
end end
end end

398
Gemfile.lock

@ -0,0 +1,398 @@
GIT
remote: git://github.com/josevalim/rails-footnotes.git
revision: 087914beabb56c2e9979f63eeb0183591065dde3
specs:
rails-footnotes (4.0.2)
rails (>= 3.2)
GIT
remote: git://github.com/svenfuchs/i18n-active_record.git
revision: 2d9a22b6a4e5d809782cdbfa65b14d9e47aa27fc
specs:
i18n-active_record (0.0.2)
i18n (>= 0.5.0)
GEM
remote: http://rubygems.org/
specs:
actionmailer (4.0.0)
actionpack (= 4.0.0)
mail (~> 2.5.3)
actionpack (4.0.0)
activesupport (= 4.0.0)
builder (~> 3.1.0)
erubis (~> 2.7.0)
rack (~> 1.5.2)
rack-test (~> 0.6.2)
activemodel (4.0.0)
activesupport (= 4.0.0)
builder (~> 3.1.0)
activerecord (4.0.0)
activemodel (= 4.0.0)
activerecord-deprecated_finders (~> 1.0.2)
activesupport (= 4.0.0)
arel (~> 4.0.0)
activerecord-deprecated_finders (1.0.3)
activerecord-session_store (0.1.0)
actionpack (>= 4.0.0, < 5)
activerecord (>= 4.0.0, < 5)
railties (>= 4.0.0, < 5)
activesupport (4.0.0)
i18n (~> 0.6, >= 0.6.4)
minitest (~> 4.2)
multi_json (~> 1.3)
thread_safe (~> 0.1)
tzinfo (~> 0.3.37)
acts_as_list (0.4.0)
activerecord (>= 3.0)
addressable (2.3.6)
arel (4.0.2)
awesome_print (1.2.0)
bcrypt (3.1.7-x86-mingw32)
better_errors (1.1.0)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
builder (3.1.4)
callsite (0.0.11)
capistrano (2.15.5)
highline
net-scp (>= 1.0.0)
net-sftp (>= 2.0.0)
net-ssh (>= 2.0.14)
net-ssh-gateway (>= 1.1.0)
capybara (2.4.1)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
carmen (1.0.1)
unicode_utils (~> 1.4.0)
carmen-rails (1.0.1)
carmen (~> 1.0.0)
rails
carrierwave (0.10.0)
activemodel (>= 3.2.0)
activesupport (>= 3.2.0)
json (>= 1.7)
mime-types (>= 1.16)
carrierwave-imageoptimizer (1.2.1)
carrierwave (~> 0.8)
image_optimizer (~> 1.2)
celluloid (0.15.2)
timers (~> 1.1.0)
childprocess (0.5.3)
ffi (~> 1.0, >= 1.0.11)
chunky_png (1.3.1)
coderay (1.1.0)
coffee-rails (4.0.1)
coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.0)
coffee-script (2.3.0)
coffee-script-source
execjs
coffee-script-source (1.7.1)
compass (0.12.7)
chunky_png (~> 1.2)
fssm (>= 0.2.7)
sass (~> 3.2.19)
compass-rails (1.1.7)
compass (>= 0.12.2)
sprockets (<= 2.11.0)
coveralls (0.7.0)
multi_json (~> 1.3)
rest-client
simplecov (>= 0.7)
term-ansicolor
thor
crack (0.4.2)
safe_yaml (~> 1.0.0)
cucumber (1.3.15)
builder (>= 2.1.2)
diff-lcs (>= 1.1.3)
gherkin (~> 2.12)
multi_json (>= 1.7.5, < 2.0)
multi_test (>= 0.1.1)
cucumber-rails (1.4.1)
capybara (>= 1.1.2, < 3)
cucumber (>= 1.3.8, < 2)
mime-types (~> 1.16)
nokogiri (~> 1.5)
rails (>= 3, < 5)
database_cleaner (1.3.0)
debug_inspector (0.0.2)
diff-lcs (1.2.5)
docile (1.1.5)
erubis (2.7.0)
execjs (2.2.1)
factory_girl (4.4.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.4.1)
factory_girl (~> 4.4.0)
railties (>= 3.0.0)
faraday (0.9.0)
multipart-post (>= 1.2, < 3)
ffi (1.9.3-x86-mingw32)
font-awesome-rails (4.1.0.0)
railties (>= 3.2, < 5.0)
forgery (0.6.0)
formatador (0.2.5)
foundation-rails (5.3.1.0)
railties (>= 3.1.0)
sass (>= 3.2.0)
fssm (0.2.10)
geocoder (1.2.3)
gherkin (2.12.2-x86-mingw32)
multi_json (~> 1.3)
guard (2.6.1)
formatador (>= 0.2.4)
listen (~> 2.7)
lumberjack (~> 1.0)
pry (>= 0.9.12)
thor (>= 0.18.1)
guard-rspec (4.2.10)
guard (~> 2.1)
rspec (>= 2.14, < 4.0)
haml (4.0.5)
tilt
haml-rails (0.5.1)
actionpack (~> 4.0.0)
activesupport (~> 4.0.0)
haml (>= 3.1, < 5.0)
railties (~> 4.0.0)
highline (1.6.21)
hike (1.2.3)
httpauth (0.2.1)
i18n (0.6.11)
image_optimizer (1.2.1)
jquery-rails (3.1.1)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.0)
railties (>= 3.2.16)
json (1.8.1)
jwt (0.1.13)
multi_json (>= 1.5)
launchy (2.4.2)
addressable (~> 2.3)
listen (2.7.9)
celluloid (>= 0.15.2)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
lumberjack (1.0.9)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
meta_request (0.3.3)
callsite (~> 0.0, >= 0.0.11)
rack-contrib (~> 1.1)
railties (>= 3.0.0, < 5.0.0)
method_source (0.8.2)
mime-types (1.25.1)
mini_magick (3.7.0)
subexec (~> 0.2.1)
mini_portile (0.6.0)
minitest (4.7.5)
multi_json (1.10.1)
multi_test (0.1.1)
multipart-post (2.0.0)
nested_form (0.3.2)
net-scp (1.2.1)
net-ssh (>= 2.6.5)
net-sftp (2.1.2)
net-ssh (>= 2.6.5)
net-ssh (2.9.1)
net-ssh-gateway (1.2.0)
net-ssh (>= 2.6.5)
netrc (0.7.7)
nokogiri (1.6.2.1-x86-mingw32)
mini_portile (= 0.6.0)
oauth (0.4.7)
oauth2 (0.8.1)
faraday (~> 0.8)
httpauth (~> 0.1)
jwt (~> 0.1.4)
multi_json (~> 1.0)
rack (~> 1.2)
paper_trail (3.0.3)
activerecord (>= 3.0, < 5.0)
activesupport (>= 3.0, < 5.0)
pg (0.17.1-x86-mingw32)
polyglot (0.3.5)
pry (0.10.0-x86-mingw32)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
win32console (~> 1.3)
rack (1.5.2)
rack-contrib (1.1.0)
rack (>= 0.9.1)
rack-test (0.6.2)
rack (>= 1.0)
rails (4.0.0)
actionmailer (= 4.0.0)
actionpack (= 4.0.0)
activerecord (= 4.0.0)
activesupport (= 4.0.0)
bundler (>= 1.3.0, < 2.0)
railties (= 4.0.0)
sprockets-rails (~> 2.0.0)
rails-assets-cdn (0.1.0)
rails
rails_12factor (0.0.2)
rails_serve_static_assets
rails_stdout_logging
rails_serve_static_assets (0.0.2)
rails_stdout_logging (0.0.3)
railties (4.0.0)
actionpack (= 4.0.0)
activesupport (= 4.0.0)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (10.3.2)
rb-fsevent (0.9.4)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
rest-client (1.7.2-x86-mingw32)
ffi (~> 1.9)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
rspec (3.0.0)
rspec-core (~> 3.0.0)
rspec-expectations (~> 3.0.0)
rspec-mocks (~> 3.0.0)
rspec-core (3.0.2)
rspec-support (~> 3.0.0)
rspec-expectations (3.0.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.0.0)
rspec-mocks (3.0.2)
rspec-support (~> 3.0.0)
rspec-rails (3.0.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.0.0)
rspec-expectations (~> 3.0.0)
rspec-mocks (~> 3.0.0)
rspec-support (~> 3.0.0)
rspec-support (3.0.2)
rubyzip (1.1.6)
rvm-capistrano (1.5.3)
capistrano (~> 2.15.4)
safe_yaml (1.0.3)
sass (3.2.19)
sass-rails (4.0.3)
railties (>= 4.0.0, < 5.0)
sass (~> 3.2.0)
sprockets (~> 2.8, <= 2.11.0)
sprockets-rails (~> 2.0)
selenium-webdriver (2.42.0)
childprocess (>= 0.5.0)
multi_json (~> 1.0)
rubyzip (~> 1.0)
websocket (~> 1.0.4)
simplecov (0.9.0)
docile (~> 1.1.0)
multi_json
simplecov-html (~> 0.8.0)
simplecov-html (0.8.0)
sitemap_generator (5.0.4)
builder
slop (3.6.0)
sorcery (0.8.6)
bcrypt (~> 3.1)
oauth (~> 0.4, >= 0.4.4)
oauth2 (>= 0.8.0, < 1.0.0)
sprockets (2.11.0)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sprockets-rails (2.0.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (~> 2.8)
subexec (0.2.3)
term-ansicolor (1.3.0)
tins (~> 1.0)
thor (0.19.1)
thread_safe (0.3.4)
tilt (1.4.1)
timers (1.1.0)
tins (1.3.0)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.40)
uglifier (2.5.3)
execjs (>= 0.3.0)
json (>= 1.8.0)
unicode_utils (1.4.0)
wdm (0.1.0)
webmock (1.18.0)
addressable (>= 2.3.6)
crack (>= 0.3.2)
websocket (1.0.7)
win32console (1.3.2-x86-mingw32)
wysiwyg-rails (1.1.6)
font-awesome-rails (= 4.1.0.0)
railties (>= 3.2, < 5.0)
xpath (2.0.0)
nokogiri (~> 1.3)
PLATFORMS
x86-mingw32
DEPENDENCIES
activerecord-session_store
acts_as_list
awesome_print
better_errors
binding_of_caller
capistrano
capybara
carmen-rails
carrierwave
carrierwave-imageoptimizer
coffee-rails (~> 4.0.0)
compass-rails (~> 1.1.3)
coveralls
cucumber-rails
database_cleaner
factory_girl_rails
font-awesome-rails
forgery
foundation-rails
geocoder
guard-rspec
haml
haml-rails
i18n-active_record!
jquery-rails
jquery-ui-rails
launchy
meta_request
mini_magick
nested_form
oauth2 (~> 0.8.0)
paper_trail
pg
rails (= 4.0.0)
rails-assets-cdn
rails-footnotes!
rails_12factor
rspec
rspec-rails
rvm-capistrano
sass-rails (~> 4.0.0)
selenium-webdriver
simplecov
sitemap_generator
sorcery (>= 0.8.1)
uglifier (>= 1.3.0)
wdm (>= 0.1.0)
webmock
wysiwyg-rails

BIN
app/assets/images/Thumbs.db

Binary file not shown.

37
app/assets/javascripts/editor.js.coffee

@ -0,0 +1,37 @@
#= require froala_editor.min.js
$ ->
$('[data-editable]').editable({inlineMode: true, blockTags: ["n", "p", "h2", "blockquote", "pre"], buttons: ["formatBlock", "bold", "italic", "underline", "insertOrderedList", "insertUnorderedList", "sep", "createLink", "insertImage", "insertVideo", "html", "undo", "redo"]})
$('[data-editor]').editable({inlineMode: false, blockTags: ["n", "p", "h2", "blockquote", "pre"], buttons: ["formatBlock", "bold", "italic", "underline", "insertOrderedList", "insertUnorderedList", "sep", "createLink", "html", "undo", "redo"]})
$('.field.country-select-field select').change () ->
$country = $(this)
country = $country.val()
$territory = $('.field.subregion-select-field select')
if $territory.data().country == country
$territory.removeClass('can cant').addClass('can')
return
$.post '/location/territories', {country: country},
(json) ->
$territory.html('')
if json && Object.keys(json).length
$.each json, (code, name) ->
$territory.append($('<option>').text(name).attr('value', code))
return
$territory.removeClass('can cant').addClass('can')
$territory.data().country = country
else
$territory.removeClass('can cant').addClass('cant')
return
, 'json'
$('img + input[type="file"]').change () ->
readURL(this);
return
readURL = (input) ->
reader = null
if input.files && input.files[0]
reader = new FileReader()
reader.readAsDataURL input.files[0]
reader.onload = (e) ->
$(input).prev().attr('src', e.target.result)
return

2
app/assets/stylesheets/application.css.scss

@ -27,7 +27,7 @@
// Libraries // Libraries
@import "compass"; @import "compass";
//@import "font-awesome"; @import "font-awesome";
@import "foundation_and_overrides"; @import "foundation_and_overrides";
// Local settings (also edit foundation_and_overrides.scss to modify global variables) // Local settings (also edit foundation_and_overrides.scss to modify global variables)

5
app/assets/stylesheets/foundation_and_overrides.scss

@ -40,6 +40,7 @@
//$header-font-family: 'alte_haas_groteskbold', 'Alte Haas Grotesk', sans-serif;//join("Open Sans", $body-font-family); //$header-font-family: 'alte_haas_groteskbold', 'Alte Haas Grotesk', sans-serif;//join("Open Sans", $body-font-family);
$header-font-family: 'AlteHaasGroteskBold', sans-serif;//join("Open Sans", $body-font-family); $header-font-family: 'AlteHaasGroteskBold', sans-serif;//join("Open Sans", $body-font-family);
$header-font-weight: bold; $header-font-weight: bold;
$icons: FontAwesome;//join("Open Sans", $body-font-family);
// $header-font-style: normal; // $header-font-style: normal;
// $header-font-color: #222; // $header-font-color: #222;
// $header-line-height: 1.4; // $header-line-height: 1.4;
@ -80,9 +81,9 @@ $body-font-family: 'Source Sans Pro', sans-serif;
$primary-color: $color-1; $primary-color: $color-1;
$secondary-color: $color-2; $secondary-color: $color-2;
$alert-color: $color-4; $alert-color: $color-3;
$success-color: $color-2; $success-color: $color-2;
$warning-color: $color-3; $warning-color: $color-4;
$info-color: $color-5; $info-color: $color-5;
// We use these to make sure border radius matches unless we want it different. // We use these to make sure border radius matches unless we want it different.

110
app/assets/stylesheets/sass/_base.scss

@ -286,6 +286,116 @@ ul.tags,
} }
} }
.org-mini-preview {
position: relative;
overflow: auto;
margin: 0;
background-color: $gray;
border: 0.25em solid lighten($black, 33);
&.portrait {
img {
float: left;
max-width: 50%;
}
figcaption {
float: right;
max-width: 50%;
}
}
p {
font-size: 0.9em;
line-height: 1.25em;
}
figcaption {
padding: 0.25em
}
}
.org-list-select {
&.chosen {
display: none;
}
ul {
list-style: none;
margin: 0;
overflow: auto;
height: 25em;
border: 0.25em solid $gray;
}
li {
background-color: lighten($gray, 5);//rgba(225, 225, 225, 0.5);
margin: 0.25em;
&:hover {
background-color: lighten($color-4, 25);//desaturate(lighten($organization-color, 33), 33);
}
&.removable:hover {
background-color: desaturate(lighten($color-3, 16), 16);
}
&.selected {
background-color: desaturate(lighten($organization-color, 33), 33);
}
&.not-found {
display: none;
}
}
figure {
margin: 0;
padding: 0.25em;
overflow: auto;
}
img {
float: left;
margin-right: 1em;
}
h6 {
margin: 0;
}
p {
font-size: 0.8em;
margin: 0;
}
figcaption {
overflow: auto;
}
@include breakpoint(medium) {
&.chosen {
display: block;
}
&.choose {
li.selected {
display: none;
}
}
}
}
#org-filter {
width: 100%;
font-size: 1.25em;
padding: 0.333em;
border: 3px solid $gray;
margin-top: 0.5em;
outline: none !important;
}
@include breakpoint(medium) { @include breakpoint(medium) {
.organizations-index, .organizations-index,
.conferences-index { .conferences-index {

11
app/assets/stylesheets/sass/_layout.scss

@ -406,6 +406,7 @@ main {
+ em { + em {
display: block; display: block;
color: $color-5; color: $color-5;
font-weight: 600;
margin-bottom: 1em; margin-bottom: 1em;
} }
} }
@ -428,14 +429,16 @@ main {
figure { figure {
margin: 2em 0 0; margin: 2em 0 0;
img {
box-shadow: 0 0 2em $black;
}
} }
} }
} }
.page-style-emphasize-banner & {
figure img {
box-shadow: 0 0 2em $black;
}
}
.organizations-index &, .organizations-index &,
.conferences-index & { .conferences-index & {
height: 13vw; height: 13vw;

71
app/assets/stylesheets/sass/_typography.scss

@ -49,6 +49,28 @@
color: $article-color; color: $article-color;
} }
} }
&[id*="previous"],
&.less,
&.arrow-l {
&:before {
content: '\f053';
font-family: $icons;
vertical-align: middle;
margin-right: 0.25em;
}
}
&[id*="next"],
&.more,
&.arrow-r {
&:after {
content: '\f054';
font-family: $icons;
vertical-align: middle;
margin-left: 0.25em;
}
}
} }
input[type="file"] { input[type="file"] {
@ -159,9 +181,9 @@ fieldset {
font-size: 1.25em; font-size: 1.25em;
} }
&.text-area { &.text-area-field {
label { label {
top: 1px; /*top: 1px;
right: 1px; right: 1px;
bottom: 1px; bottom: 1px;
left: 1px; left: 1px;
@ -173,10 +195,15 @@ fieldset {
background-color: rgba(255, 255, 255, 0.5); background-color: rgba(255, 255, 255, 0.5);
text-align: center; text-align: center;
width: calc(100% - 2px); width: calc(100% - 2px);
height: calc(100% - 2px); height: calc(100% - 2px);*/
position: static;
background-color: #252528;
margin-top: 1em;
span { span {
position: relative; background-color: inherit;
color: $white;
/*position: relative;
top: 50%; top: 50%;
text-align: center; text-align: center;
font-size: 1.25em; font-size: 1.25em;
@ -185,10 +212,14 @@ fieldset {
padding: 0 0.5em; padding: 0 0.5em;
display: inline-block; display: inline-block;
border-radius: 0.5em; border-radius: 0.5em;
box-shadow: 0 0 1em; box-shadow: 0 0 1em;*/
} }
} }
.froala-element {
min-height: 10em;
}
textarea:focus + label { textarea:focus + label {
display: none; display: none;
} }
@ -250,6 +281,8 @@ fieldset {
} }
&.check-box-field { &.check-box-field {
margin-bottom: 0;
div { div {
float: left; float: left;
font-size: 1.75em; font-size: 1.75em;
@ -272,6 +305,11 @@ fieldset {
content: ''; content: '';
}*/ }*/
} }
input {
margin: 0;
}
label { label {
position: relative; position: relative;
margin: 0; margin: 0;
@ -564,3 +602,26 @@ article {
font-size: 1.4rem; font-size: 1.4rem;
} }
} }
.error {
position: relative;
padding: 0.5em 1em;
background-color: $warning-color;
&:before {
content: '!';
position: absolute;
font-family: $header-font-family;
background-color: $alert-color;
color: $white;
font-size: 2em;
line-height: 1em;
width: 1em;
text-align: center;
border-radius: 50%;
right: -0.333em;
top: -0.333em;
}
}
p.help {
font-size: 1.1em;
}

240
app/controllers/conferences_controller.rb

@ -115,47 +115,245 @@ class ConferencesController < ApplicationController
next_step = nil next_step = nil
if !session[:registration] if !session[:registration]
session[:registration] = Hash.new session[:registration] = Hash.new
session[:registration][:path] = Array.new
end end
case params['step'] case params['step']
when 'register' when 'register'
session[:registration][:email] = params[:email] session[:registration][:email] = params[:email]
user = User.find_by(:email => params[:email]) || User.new(:email => params[:email], :role => 'unverified') user = User.find_by(:email => params[:email])
registration = ConferenceRegistration.new(:conference_id => @conference.id, :is_attending => 'yes', :is_participant => params[:is_participant], :is_volunteer => params[:is_volunteer]) #registration = ConferenceRegistration.new(:conference_id => @conference.id, :is_attending => 'yes', :is_participant => params[:is_participant], :is_volunteer => params[:is_volunteer])
session[:registration][:user] = user session[:registration][:user] = Hash.new
session[:registration][:organizations] = Array.new
session[:registration][:user][:id] = user ? user.id : nil
if user
user.organizations.each { |org| session[:registration][:organizations] << org.id }
end
session[:registration][:user][:firstname] = user ? (user.firstname || user.username) : nil
session[:registration][:user][:lastname] = user ? user.lastname : nil
session[:registration][:user][:username] = user ? user.username : nil
next_step = 'primary' next_step = 'primary'
when 'primary' when 'primary'
next_step = user.organizations.length > 0 ? 'questions' : 'organizations' if !params[:firstname] || !params[:lastname]
session[:registration][:user].firstname = params[:firstname] error = _'registration.register.no_name_error','Oh, c\'mon, please tell us your name. We promise not to share it with anyone, we just don\'t want to get you mixed up with someone else.'
session[:registration][:user].firstname = params[:lastname] end
if !session[:registration][:user].role == 'unverified' session[:registration][:user][:firstname] = params[:firstname]
session[:registration][:user].username = params[:username] session[:registration][:user][:firstname] = params[:lastname]
session[:registration][:is_volunteer] = params[:is_volunteer]
session[:registration][:is_participant] = params[:is_participant]
if !session[:registration][:user][:id]
session[:registration][:user][:username] = params[:username] || (params[:firstname] + ' ' + params[:lastname])
end
if params[:is_volunteer]
next_step = 'volunteer_questions'
elsif params[:is_participant]
next_step = 'organizations'
else
error = _'registration.register.no_role_error',"Please let us know if you're attending the conference or volunteering (or both)"
end
when 'organizations'
session[:registration][:organizations] = Array.new
if params[:org].length > 0
params[:org].each { |org| session[:registration][:organizations] << org }
if params[:add_new_org]
session[:registration][:new_organization] ||= Array.new
session[:registration][:new_organization][0] ||= Hash.new
session[:registration][:new_org_index] = 0
if !session[:registration][:new_organization][0][:country]
my_location = lookup_ip_location
session[:registration][:new_organization][0][:country] = my_location.country_code
session[:registration][:new_organization][0][:territory] = my_location.province_code
session[:registration][:new_organization][0][:city] = my_location.city
end
next_step = 'new_organization'
else
next_step = 'questions'
end
elsif params[:add_new_org]
session[:registration][:questions] ||= Hash.new
next_step = 'questions'
else
error = _'registration.register.no_organization_error',"Please select an organization or enter a new one"
end
when 'new_organization'
if !params[:city]
message = _'register.new_organization.no_city_error','Please enter your organization\'s city'
end
if !params[:street]
message = _'register.new_organization.no_street_error','Please enter your organization\'s street address'
end
if !params[:organization_email]
message = _'register.new_organization.no_email_error','Please tell us your organization\'s email address. We need it so that we can send out invitaions for upcoming conferences. No spam, we promise, and you\'ll be able to edit your preferences before we start ending out email.'
elsif params[:organization_email].strip.casecmp(session[:registration][:email].strip)
message = _'register.new_organization.same_email_as_attendee_error','This email needs to be different than your own personal email, we need to keep in touch with your organization even if you\'re gone in years to come.'
end
if !params[:name]
message = _'register.new_organization.no_name_error','Please tell us your organization\'s name'
end
i = params[:new_org_index].to_i
session[:registration][:new_organization][i][:country] = params[:organization_country]
session[:registration][:new_organization][i][:territory] = params[:organization_territory]
session[:registration][:new_organization][i][:city] = params[:organization_city]
session[:registration][:new_organization][i][:street] = params[:organization_street]
session[:registration][:new_organization][i][:info] = params[:organization_info]
session[:registration][:new_organization][i][:email] = params[:organization_email]
session[:registration][:new_organization][i][:name] = params[:organization_name]
if params[:organization_logo]
if session[:registration][:new_organization][i][:organization_logo]
FileUtils.rm session[:registration][:new_organization][i][:organization_logo]
end
base_dir = File.join("public", "registration_data")
FileUtils.mkdir_p(base_dir) unless File.directory?(base_dir)
hash_dir = rand(36**16).to_s(36)
dir = File.join(base_dir, hash_dir)
while File.directory?(dir)
hash_dir = rand(36**16).to_s(36)
dir = File.join(base_dir, hash_dir)
end
FileUtils.mkdir_p(dir)
session[:registration][:new_organization][i][:organization_logo] = File.join("registration_data", hash_dir, params[:organization_logo].original_filename)
FileUtils.cp params[:organization_logo].tempfile.path, File.join("public", session[:registration][:new_organization][i][:organization_logo])
end
if params[:add_another_org] && params[:add_another_org].to_sym == :on
next_step = 'new_organization'
if params[:previous]
session[:registration][:new_org_index] = [0, i - 1].max
elsif !error
session[:registration][:new_org_index] = i + 1
session[:registration][:new_organization][i + 1] ||= Hash.new
if !session[:registration][:new_organization][i + 1][:country]
session[:registration][:new_organization][i + 1][:country] = session[:registration][:new_organization][i][:country]
session[:registration][:new_organization][i + 1][:territory] = session[:registration][:new_organization][i][:territory]
session[:registration][:new_organization][i + 1][:city] = session[:registration][:new_organization][i][:city]
end
end
else
if session[:registration][:new_organization][i + 1]
session[:registration][:new_organization] = session[:registration][:new_organization].first(i + 1)
end
next_step = 'questions'
end
when 'questions'
session[:registration][:questions] = params[:questions].deep_symbolize_keys
session[:registration][:is_workshop_host] = params[:is_workshop_host].to_i
if !params[:is_workshop_host].to_i.zero?
next_step = 'new_workshop'
session[:registration][:workshop] ||= Array.new
session[:registration][:workshop][0] ||= Hash.new
session[:registration][:workshop_index] = 0
else
next_step = 'submit'
end
when 'volunteer_questions'
session[:registration][:volunteer_questions] = params[:volunteer_questions].deep_symbolize_keys
if session[:registration][:is_participant]
next_step = 'organizations'
else
next_step = 'submit'
end
when 'new_workshop'
i = params[:workshop_index].to_i
session[:registration][:workshop][i][:title] = params[:workshop_title]
session[:registration][:workshop][i][:info] = params[:workshop_info]
session[:registration][:workshop][i][:stream] = params[:workshop_stream]
session[:registration][:workshop][i][:presentation_style] = params[:workshop_presentation_style]
if !params[:workshop_info]
error = _'registration.register.no_workshop_info_error','Please describe your workshop as best as you can to give other participants an idea of what to expect'
end
if !params[:workshop_title]
error = _'registration.register.no_workshop_title_error','Please give your workshop a title'
end
if params[:previous]
session[:registration][:workshop_index] = [0, i - 1].max
elsif params[:add_another_workshop]
next_step = 'new_workshop'
if !error
session[:registration][:workshop] ||= Array.new
session[:registration][:workshop][i + 1] ||= Hash.new
session[:registration][:workshop_index] = i + 1
end
else
if session[:registration][:workshop][i + 1]
session[:registration][:workshop] = session[:registration][:workshop].first(i + 1)
end
next_step = 'submit'
end
when 'submit'
UserMailer.conference_registration_email(@conference, session[:registration]).deliver
session.delete(:registration)
next_step = 'thanks'
when 'cancel'
if params[:yes]
session.delete(:registration)
next_step = 'cancelled'
else
return {error: false, next_step: session[:registration][:path].pop}
end end
end end
next_step if params[:previous]
#if next_step next_step = session[:registration][:path].pop
# redirect_to :action => :register, :step => next_step else
#else if !params[:cancel] && error
# do_404 return {error: true, message: error, next_step: params['step']}
#end end
if session[:registration] && params['step']
session[:registration][:path] << params['step']
end
end
{error: false, next_step: params[:cancel] ? 'cancel' : next_step}
end end
def register def register
set_conference set_conference
#template = params['step'] ? "register_#{params['step']}" : 'register' data = register_submit
@register_step = request.post? ? register_submit : 'register' @register_step = request.post? ? data[:next_step] : 'register'
@error_message = data[:error] ? data[:message] : nil
template = (@register_step == 'register' ? '' : 'register_') + @register_step template = (@register_step == 'register' ? '' : 'register_') + @register_step
if !File.exists?(Rails.root.join("app", "views", params[:controller], "_#{template}.html.haml")) if !File.exists?(Rails.root.join("app", "views", params[:controller], "_#{template}.html.haml"))
do_404 do_404
return return
end end
#if params['step'] != true if session[:registration]
#session[:last_step] = params['step'] session[:registration][@register_step.to_sym] ||= Hash.new
#end end
@register_step = template#params['step'] || true @actions = nil
@register_content = render_to_string :partial => template case @register_step
when 'register'
@actions = :next
when 'primary', 'organizations', 'new_organization', 'new_workshop', 'volunteer_questions'
@actions = [:previous, :cancel, :next]
when 'submit'
@actions = [:previous, :cancel, :submit]
when 'cancel'
@actions = [:no, :yes]
when 'questions'
@actions = [:previous, :cancel, :next]
@housing_options = {
'I will fend for myself thanks' => 'none',
'I will need a real bed' => 'bed',
'A couch or floor space will be fine' => 'couch',
'All I need is a backyard' => 'camp'
}
session[:registration][:questions][:housing] ||= 'couch'
@loaner_bike_options = {
'No' => 'no',
'Yes' => 'medium',
'Yes but a small one please' => 'small',
'Yes but a large one please' => 'large'
}
session[:registration][:questions][:loaner_bike] ||= 'medium'
session[:registration][:questions][:diet] ||= Hash.new
end
if request.xhr? if request.xhr?
@register_content = render_to_string :partial => template
render :json => {status: 200, html: @register_content} render :json => {status: 200, html: @register_content}
else else
@register_template = template
render 'show' render 'show'
end end
end end

6
app/controllers/pages_controller.rb

@ -1,6 +1,7 @@
include ApplicationHelper include ApplicationHelper
class PagesController < ApplicationController class PagesController < ApplicationController
protect_from_forgery :except => :location_territories
#skip_before_filter :verify_authenticity_token, only: [:translate] #skip_before_filter :verify_authenticity_token, only: [:translate]
def home def home
@ -49,7 +50,10 @@ class PagesController < ApplicationController
def location_territories def location_territories
#render json: (Carmen:::RegionCollection.new(Carmen::Country.coded(params[:country])) || []).to_json #render json: (Carmen:::RegionCollection.new(Carmen::Country.coded(params[:country])) || []).to_json
territories = {} territories = {}
Carmen::Country.coded(params[:country]).subregions.each { |t| territories[t.code] = t.name } country = Carmen::Country.coded(params[:country])
if country
country.subregions.each { |t| territories[t.code] = t.name }
end
render json: territories.to_json render json: territories.to_json
end end

13
app/helpers/application_helper.rb

@ -431,6 +431,14 @@ module ApplicationHelper
_(*a) _(*a)
end end
def lookup_ip
if request.remote_ip == '127.0.0.1'
session['remote_ip'] || (session['remote_ip'] = open("http://checkip.dyndns.org").first.gsub(/^.*\s([\d\.]+).*$/s, '\1').gsub(/[^\.\d]/, ''))
else
request.remote_ip
end
end
def lookup_ip_location def lookup_ip_location
if request.remote_ip == '127.0.0.1' if request.remote_ip == '127.0.0.1'
Geocoder.search(session['remote_ip'] || (session['remote_ip'] = open("http://checkip.dyndns.org").first.gsub(/^.*\s([\d\.]+).*$/s, '\1').gsub(/[^\.\d]/, ''))).first Geocoder.search(session['remote_ip'] || (session['remote_ip'] = open("http://checkip.dyndns.org").first.gsub(/^.*\s([\d\.]+).*$/s, '\1').gsub(/[^\.\d]/, ''))).first
@ -492,6 +500,11 @@ module ApplicationHelper
subdomain == 'test' subdomain == 'test'
end end
def location(location)
territory = Carmen::Country.coded(location.country).subregions.coded(location.territory)
location.city + (territory ? ' ' + territory.name : '') + ', ' + Carmen::Country.coded(location.country).name
end
private private
def _form_field(type, name, value, options) def _form_field(type, name, value, options)
if type == 'check_box' if type == 'check_box'

4
app/helpers/bike_bike_form_helper.rb

@ -93,6 +93,7 @@ module BikeBikeFormHelper
end end
def country_select_tag(name, value, options={}) def country_select_tag(name, value, options={})
#options[:no_wrapper] = true
render_field(name, options = get_options(name, options), super(name, value, options), value) render_field(name, options = get_options(name, options), super(name, value, options), value)
end end
@ -292,7 +293,8 @@ module BikeBikeFormHelper
end end
def render_field(type, name, options, html, value = nil) def render_field(type, name, options, html, value = nil)
if (options.has_key?(:no_wrapper) && options[:no_wrapper]) || options['type'] == 'hidden' options.symbolize_keys!
if (options.has_key?(:no_wrapper) && options[:no_wrapper]) || /country/.match(name.to_s) && /^subregion_select/.match(type.to_s) || options[:type] == 'hidden'
return html return html
end end

44
app/mailers/user_mailer.rb

@ -1,25 +1,31 @@
class UserMailer < ActionMailer::Base class UserMailer < ActionMailer::Base
default from: "from@example.com" default from: "noreply@bikebike.org"
# Subject can be set in your I18n file at config/locales/en.yml # Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup: # with the following lookup:
# #
# en.user_mailer.activation_needed_email.subject # en.user_mailer.activation_needed_email.subject
# #
def activation_needed_email(email_address) def activation_needed_email(email_address)
@greeting = "Hi" @greeting = "Hi"
mail to: 'goodgodwin@hotmail.com' mail to: 'goodgodwin@hotmail.com'
end end
# Subject can be set in your I18n file at config/locales/en.yml # Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup: # with the following lookup:
# #
# en.user_mailer.activation_success_email.subject # en.user_mailer.activation_success_email.subject
# #
def activation_success_email def activation_success_email
@greeting = "Hi" @greeting = "Hi"
mail to: "to@example.org" mail to: "to@example.org"
end end
def conference_registration_email(conference, data)
@data = data
@conference = conference
mail to: data[:email], subject: 'Please confirm your registration for ' + conference.title
end
end end

12
app/models/organization.rb

@ -12,6 +12,18 @@ class Organization < ActiveRecord::Base
accepts_nested_attributes_for :locations, :reject_if => proc {|l| l[id].blank?} accepts_nested_attributes_for :locations, :reject_if => proc {|l| l[id].blank?}
accepts_nested_attributes_for :user_organization_relationships, :reject_if => proc {|u| u[:user_id].blank?}, :allow_destroy => true accepts_nested_attributes_for :user_organization_relationships, :reject_if => proc {|u| u[:user_id].blank?}, :allow_destroy => true
def location
locations.first
end
def longitude
location.longitude
end
def latitude
location.latitude
end
def to_param def to_param
slug slug
end end

2
app/views/conferences/_header.html.haml

@ -36,7 +36,7 @@
.columns.medium-4.centered.align-bottom .columns.medium-4.centered.align-bottom
%div %div
- if @conference.registration_open - if @conference.registration_open
%a.button{href: @conference.url(:register)} %a.button.arrow-r{href: @conference.url(:register)}
=_'conference.Register_Now' =_'conference.Register_Now'
- if params['controller'] != 'conferences' - if params['controller'] != 'conferences'
%a.button.more{href: @conference.url} %a.button.more{href: @conference.url}

5
app/views/conferences/_register.html.haml

@ -1,4 +1 @@
= form_tag (@conference.url + '/register/').gsub(/\/\/+/, '/'), :method => :post do = email_field_tag :email, session[:registration][:email]
= hidden_field_tag :step, @register_step
= email_field_tag :email
= form_actions :next

3
app/views/conferences/_register_cancel.html.haml

@ -0,0 +1,3 @@
%h3=_'registration.cancel.title','Cancel Registration?'
.columns.medium-offset-1.end
%p.help=_'registration.cancel.help','If you cancel now, you will lose the infomation you have submitted thus far, but you will be able to restart registration any time while registration is still open.'

3
app/views/conferences/_register_cancelled.html.haml

@ -0,0 +1,3 @@
%h3=_'registration.cancelled.title','Registration Cancelled'
.columns.medium-offset-1.end
%p.help=_'registration.cancelled.help','Your registration has been cancelled but you can always restart the process while registration is still open.'

28
app/views/conferences/_register_new_organization.html.haml

@ -0,0 +1,28 @@
- org_index = session[:registration][:new_org_index]
= hidden_field_tag :new_org_index, org_index
- if session[:registration][:new_organization].length > 1
%h3=_'registration.new_organization.list.title','Your New Organizations'
%ul.columns.medium-10.medium-offset-1
- session[:registration][:new_organization].each_with_index do |new_organization, index|
- if new_organization[:title]
%li
- if index == org_index && new_organization[:title]
%strong=new_organization[:title]
- else
= new_organization[:title]
%h3=_'registration.new_organization.title','Your Organization Information'
.columns.medium-12= text_field_tag :organization_name, session[:registration][:new_organization][org_index][:name], :required => true
.columns.medium-12= text_area_tag :organization_info, session[:registration][:new_organization][org_index][:info], :data => {:editor => ""}
.columns.medium-7
= email_field_tag :organization_email, session[:registration][:new_organization][org_index][:email], :required => true
= text_field_tag :organization_street, session[:registration][:new_organization][org_index][:street], :required => true
= text_field_tag :organization_city, session[:registration][:new_organization][org_index][:city], :required => true
= country_select_tag :organization_country, session[:registration][:new_organization][org_index][:country], :required => true
= subregion_select_tag :organization_territory, session[:registration][:new_organization][org_index][:territory], session[:registration][:new_organization][org_index][:country] || 'US', html: {class: session[:registration][:new_organization][org_index][:country] ? 'can' : 'cant', data: {:country => session[:registration][:new_organization][org_index][:country]}}
.columns.medium-5
= image_field_tag :organization_logo
.columns
= check_box_tag :add_another_org, (org_index <= session[:registration][:new_organization].length - 1)
- content_for :footer_scripts do
= javascript_include_tag 'editor'

37
app/views/conferences/_register_new_workshop.html.haml

@ -0,0 +1,37 @@
- workshop_index = session[:registration][:workshop_index]
= hidden_field_tag :workshop_index, workshop_index
- if session[:registration][:workshop].length > 1
%h3=_'registration.workshop.list.title','Your Workshops'
%ul.columns.medium-10.medium-offset-1
- session[:registration][:workshop].each_with_index do |workshop, index|
- if workshop[:title]
%li
- if index == workshop_index
%strong=workshop[:title]
- else
= workshop[:title]
%h3=_'registration.workshop.title','Workshop Information'
.columns.medium-10.medium-offset-1= text_field_tag :workshop_title, session[:registration][:workshop][workshop_index][:title], :required => true
.columns.medium-10.medium-offset-1= text_area_tag :workshop_info, session[:registration][:workshop][workshop_index][:info], :required => true, :data => {:editor => ""}
.columns.medium-5.medium-offset-1
%h4=_'registration.workshop.streams.title','Stream'
%p.help=_'registration.workshop.streams.help','Select the stream that best categorizes your workshop'
- streams = Hash.new
- streams[_'workshop_stream.select_one','Select a stream'] = ''
- WorkshopStream.all.each do |stream|
- streams[_'workshop_stream.' + stream.slug] = stream.slug
= select_tag :workshop_stream, options_for_select(streams, session[:registration][:workshop][workshop_index][:stream] || '')
.columns.medium-5.end
%h4=_'registration.workshop.styles.title','Presentation Style'
%p.help=_'registration.workshop.styles.help','Select the style that best describes how you will run your workshop'
- styles = Hash.new
- styles[_'workshop_presentation_style.select_one','Select a style'] = ''
- WorkshopPresentationStyle.all.each do |style|
- styles[_'workshop_presentation_style.' + style.slug] = style.slug
= select_tag :workshop_presentation_style, options_for_select(styles, session[:registration][:workshop][workshop_index][:presentation_style] || '')
.columns.medium-10.medium-offset-1
- #xx
= check_box_tag :add_another_workshop, "1", (workshop_index < session[:registration][:workshop].length - 1)
- content_for :footer_scripts do
= javascript_include_tag 'editor'

83
app/views/conferences/_register_organizations.html.haml

@ -0,0 +1,83 @@
%h3
=_'register.organizations.title','Who do you Represent?'
%p=_'register.organizations.description','Please let us know where you\'re coming from! Find your organizations on the right, they are listed by how close they are to you right now.'
.columns.medium-6.medium-push-6
.org-list-select.choose
%h4=_'all_organizations','All Organizations'
%ul
- my_location = lookup_ip_location
- lids = Location.near(my_location.latitude.to_s+', '+my_location.longitude.to_s, 999999, order: 'distance').map{|l|l.id}
- orgs = Hash.new
-# orgs = Organization.joins(:locations_organization).where('locations_organizations.location_id' => lids)
-# orgs.each do |org|
- lids.each do |lid|
- org = Organization.joins(:locations_organization).where('locations_organizations.location_id' => lid).first
- if org && !orgs.has_key?(org.id)
- orgs[org.id] = org.id
%li{class: 'available', data: {id: org.id}}
%a{href: '#'}
%figure
= image_tag org.avatar.icon.url
%figcaption
%h6= org.name
%p= location(org.locations[0])
%input#org-filter{placeholder: (_'orgnizations_filter.placeholder','Filter by typing text here...')}
.columns.medium-6.medium-pull-6
.org-list-select.chosen
%h4=_'my_organizations','My Organizations'
%ul
- session[:registration][:organizations].each do |org_id|
- org = Organization.find(org_id.is_a?(Array) ? org_id.first : org_id)
%li.removable
%a{href: '#'}
%figure
= image_tag org.avatar.icon.url
%figcaption
%h6= org.name
%p= location(org.locations[0])
%input{type: 'hidden', name: "org[#{org.id}]", value: "#{org.id}"}
= check_box_tag :add_new_org
= check_box_tag :no_org
- content_for :dom_ready do
:plain
update_orgs();
$('#org-filter').keyup(function(){
var $this=$(this), search = $this.val().toLowerCase(), terms = search.split(/\s+/);
if (search) {
$('.org-list-select.choose li').each(function() {
var $li = $(this), content = $li.find('h6').html().toLowerCase() + '\n' + $li.find('p').html().toLowerCase(), found = true;
for (i = 0; i < terms.length && found; i++) {
found = (content.indexOf(terms[i]) >= 0);
}
$li.removeClass('not-found');
if (!found) {
$li.addClass('not-found');
}
});
} else {
$('.org-list-select.choose li').removeClass('not-found');
}
});
$('.org-list-select').on('click', 'li a', function(e){e.preventDefault();
var $li = $(this).parent().clone();
if ($li.hasClass('selected')) {
$('.org-list-select.chosen li input[value="' + $li.data().id + '"]').parent().remove();
} else if ($li.hasClass('available')) {
$li.attr('class', 'removable').append('<input type="hidden" name="org[' + $li.data().id + ']" value="' + $li.data().id + '" />');
$('.org-list-select.chosen ul').append($li);
} else if ($li.hasClass('removable')) {
$(this).parent().remove();
}
update_orgs();
});
- content_for :scripts do
:plain
function update_orgs() {
$('.field-no-org').toggle($('.org-list-select.chosen li').length <= 0);
$('.org-list-select.choose li.selected').removeClass('selected');
$('.org-list-select.chosen li input').each(function() {
$('.org-list-select.choose li[data-id="' + $(this).val() + '"]').addClass('selected');
});
}

22
app/views/conferences/_register_primary.html.haml

@ -1,14 +1,10 @@
= form_tag (@conference.url + '/register/').gsub(/\/\/+/, '/'), :class => 'row', :method => :post do .columns.medium-6= text_field_tag :firstname, session[:registration][:user][:firstname], :required => true
= hidden_field_tag :step, @register_step .columns.medium-6= text_field_tag :lastname, session[:registration][:user][:lastname], :required => true
- user = session[:registration][:user] - if !session[:registration][:user][:id]
.columns.medium-6= text_field_tag :firstname, user ? (user.firstname || user.username) : nil, :required => true
.columns.medium-6= text_field_tag :lastname, user ? user.lastname : nil, :required => true
.columns .columns
= text_field_tag :username, user ? user.username : nil, :readonly => (user && user.username) = text_field_tag :username, session[:registration][:user][:username]
.columns .columns
%h3 %h3=_'registration.primary.role_title','Attending as:'
Attending as: .columns.small-offset-1
.columns.small-offset-1 = check_box_tag :is_participant, session[:registration][:is_participant]
= check_box_tag :is_participant = check_box_tag :is_volunteer, session[:registration][:is_volunteer]
= check_box_tag :is_volunteer
.columns= form_actions :next

34
app/views/conferences/_register_questions.html.haml

@ -0,0 +1,34 @@
%h3=_'registration.questions.title','Conference Participant Information'
.columns.medium-offset-1.end
%h4=_'registration.questions.housing','Do you require housing?'
%p.help=_'registration.questions.housing.help','We will do our best to accommodate everyone but we will be working on a first come, first serve basis. If we cannot accommodate your needs, we will do our best to let you know ahead of time.'
.columns.medium-8.medium-offset-2.end
= select_tag '[questions][housing]', options_for_select(@housing_options, session[:registration][:questions][:housing])
%h5=_'registration.questions.housing_extra.title','Any else we should keep in mind?'
= text_area_tag '[questions][housing_extra]', session[:registration][:questions][:housing_extra], :label => false
.columns.medium-offset-1.end
%h4=_'registration.questions.loaner_bike','Do you want to borrow a bike?'
%p.help=_'registration.questions.loaner_bike.help','Again, we will do our best to find you a suitable bike but it\'s on a first come, first serve basis.'
.columns.medium-8.medium-offset-2.end
= select_tag '[questions][loaner_bike]', options_for_select(@loaner_bike_options, session[:registration][:questions][:loaner_bike])
.columns.medium-offset-1.end
%h4=_'registration.questions.diet','We\'ll be serving some food. Do you have any dietary restrictions?'
.columns.medium-8.medium-offset-2.end
= check_box_tag '[questions][diet][no_meat]', session[:registration][:questions][:diet][:no_meat]
= check_box_tag '[questions][diet][no_dairy]', session[:registration][:questions][:diet][:no_dairy]
= check_box_tag '[questions][diet][no_animal_products]', session[:registration][:questions][:diet][:no_animal_products]
= check_box_tag '[questions][diet][no_gluten]', session[:registration][:questions][:diet][:no_gluten]
= check_box_tag '[questions][diet][no_nuts]', session[:registration][:questions][:diet][:no_nuts]
%h5=_'registration.questions.diet_extra.title','Anything else?'
= text_area_tag '[questions][diet][diet_extra]', session[:registration][:questions][:diet_extra], :label => false
.columns.medium-offset-1.end
%h4=_'registration.questions.workshop','Would you ilke to host a workshop?'
%p.help=_'registration.questions.workshop.help','Did you have an idea for a workshop that you\d like to help run? If so, we\'ll ask some follow-up questions on the following page.'
.columns.medium-8.medium-offset-2.end
= select_tag :is_workshop_host, options_for_select({(_'Yes') => 1, (_'No') => 0}, session[:registration][:is_workshop_host] || 0)
.columns.medium-offset-1.end
%h4=_'registration.questions.other','Anything else we should know about your visit?'
.columns.medium-8.medium-offset-2.end
= text_area_tag '[questions][other]', session[:registration][:questions][:other], :label => false

3
app/views/conferences/_register_submit.html.haml

@ -0,0 +1,3 @@
%h3=_'registration.submit.title','Ready to Submit'
.columns.medium-offset-1.end
%p.help=_'registration.submit.help','That\'s all we need to know right now, if you need to make any changes, please press the \'Previous\' button now. Otherwise just click \'Submit\' and you will get a confirmation email. YOU MUST CONFIRM once you get that email in order for us to know that you are coming. This is to confirm that you and your email address are real. We will send you occassional updates afterwards.'

6
app/views/conferences/_register_thanks.html.haml

@ -0,0 +1,6 @@
%h3=_'registration.thanks.title','Thanks for submitting your registration'
.columns.medium-offset-1.end
%h4=_'registration.thanks.remember_to_confirm','Remember to confirm your registration upon receiving the confirmation email'
%p.help
=_'registration.thanks.remember_to_confirm.help','If you experience any technical issues, please contact Godwin directly at'
%a{href: 'mailto:goodgodwin@hotmail.com'}='goodgodwin@hotmail.com'

31
app/views/conferences/_register_volunteer_questions.html.haml

@ -0,0 +1,31 @@
%h3=_'registration.volunteer_questions.title','Conference Volunteer Information'
.columns.medium-offset-1.end
%h4=_'registration.volunteer_questions.contact_info','Contact Information'
.columns.medium-8.medium-offset-2.end
%p.help=_'registration.volunteer_questions.contact.help','If you are housing guests, they will need your address and phone number, otherwise we will need your address to coordinate cooking. If you have additional concerns, please let us know in the comments below.'
= text_field_tag '[volunteer_questions][address]', session[:registration][:volunteer_questions][:address]
= text_field_tag '[volunteer_questions][phone_number]', session[:registration][:volunteer_questions][:phone_number]
.columns.medium-offset-1.end
%h4=_'registration.volunteer_questions.has_kitchen','Do have a kitchen / cook space to offer?'
.columns.medium-8.medium-offset-2.end
= select_tag '[volunteer_questions][has_kitchen]', options_for_select({(_'Yes') => 1, (_'No') => 0}, session[:registration][:volunteer_questions][:has_kitchen] || 0)
.columns.medium-offset-1.end
%h4=_'registration.volunteer_questions.has_housing','Do you have housing to offer for out of town attendees?'
.columns.medium-offset-2.medium-5
%h5=_'registration.volunteer_questions.beds','Spare Beds:'
.columns.medium-3.end
= number_field_tag '[volunteer_questions][beds]', session[:registration][:volunteer_questions][:beds] || 0, :label => false
.columns.medium-offset-2.medium-5
%h5=_'registration.volunteer_questions.couch_space','Number you can accomodate on couches/floor space:'
.columns.medium-3.end
= number_field_tag '[volunteer_questions][beds]', session[:registration][:volunteer_questions][:couch_space] || 0, :label => false
.columns.medium-offset-2.medium-5
%h5=_'registration.volunteer_questions.tents','Estimated number of tests you\'d be willing to have in your yard:'
.columns.medium-3.end
= number_field_tag '[volunteer_questions][tents]', session[:registration][:volunteer_questions][:tents] || 0, :label => false
.columns.medium-offset-1.end
%h4=_'registration.volunteer_questions.other','Anything else you\'d like to tell us?'
.columns.medium-8.medium-offset-2.end
= text_area_tag '[volunteer_questions][other]', session[:registration][:volunteer_questions][:other], :label => false

13
app/views/conferences/show.html.haml

@ -5,13 +5,22 @@
- description "#{@conference.title} conference in #{location_name} for DIY bicycle collectives, co-ops, and advocacy groups" - description "#{@conference.title} conference in #{location_name} for DIY bicycle collectives, co-ops, and advocacy groups"
= render 'header' = render 'header'
= tabs! =# tabs!
%article.row %article.row
.columns.large-10 .columns.large-10
- if @register_step - if @register_step
%h2='Register!' %h2='Register!'
= @register_content.html_safe - if @actions
= form_tag (@conference.url + '/register/').gsub(/\/\/+/, '/'), :method => :post do
= hidden_field_tag :step, @register_step
- if @error_message
.columns.medium-8.medium-centered
%p.error=@error_message
= render @register_template
.columns= form_actions @actions
- else
= render @register_template
- else - else
%h2=('About '+@conference.title) %h2=('About '+@conference.title)
=p @conference, :info =p @conference, :info

23
app/views/layouts/application.html.haml

@ -6,19 +6,16 @@
%title= (yield :title) + (content_for?(:title) ? ' | ' : '') + 'Bike!Bike!' %title= (yield :title) + (content_for?(:title) ? ' | ' : '') + 'Bike!Bike!'
%meta{ name: 'description', content: (yield_or_default :description, 'Bike!Bike! conferences for DIY bicycle collectives, co-ops, and advocacy groups') } %meta{ name: 'description', content: (yield_or_default :description, 'Bike!Bike! conferences for DIY bicycle collectives, co-ops, and advocacy groups') }
= csrf_meta_tags = csrf_meta_tags
= yield :head
/[if lt IE 9] /[if lt IE 9]
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
= stylesheet_link_tag '//fonts.googleapis.com/css?family=Source+Sans+Pro:400,700,400italic,700italic', 'application', media: 'all' = stylesheet_link_tag '//fonts.googleapis.com/css?family=Source+Sans+Pro:400,700,400italic,700italic', 'application', media: 'all'
%link{ href: asset_path('favicon.ico'), rel: 'shortcut icon', type: 'image/x-icon' } %link{ href: asset_path('favicon.ico'), rel: 'shortcut icon', type: 'image/x-icon' }
%link{ href: asset_path('favicon.ico'), rel: 'icon', type: 'image/x-icon' } %link{ href: asset_path('favicon.ico'), rel: 'icon', type: 'image/x-icon' }
%link{ href: asset_path('apple-touch-icon.png'), rel: 'apple-touch-icon' } %link{ href: asset_path('apple-touch-icon.png'), rel: 'apple-touch-icon' }
%link{ href: asset_path('apple-touch-icon-72x72.png'), rel: 'apple-touch-icon', sizes: '72x72' } %link{ href: asset_path('apple-touch-icon-72x72.png'), rel: 'apple-touch-icon', sizes: '72x72' }
%link{ href: asset_path('apple-touch-icon-114x114.png'), rel: 'apple-touch-icon', sizes: '114x114' } %link{ href: asset_path('apple-touch-icon-114x114.png'), rel: 'apple-touch-icon', sizes: '114x114' }
%link{ href: asset_path('apple-touch-icon-144x144.png'), rel: 'apple-touch-icon', sizes: '144x144' } %link{ href: asset_path('apple-touch-icon-144x144.png'), rel: 'apple-touch-icon', sizes: '144x144' }
= yield :head
=# javascript_include_tag '//use.typekit.net/iqv7hcg.js' =# javascript_include_tag '//use.typekit.net/iqv7hcg.js'
=# javascript_include_tag 'application' =# javascript_include_tag 'application'
=# javascript_include_tag 'nested_form' =# javascript_include_tag 'nested_form'
@ -43,15 +40,15 @@
#content=yield #content=yield
- else - else
= yield = yield
%footer = yield :garbage
#footer #footer
.container= render 'shared/footer' %footer
.container= render 'shared/footer'
= javascript_include_tag '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js' = javascript_include_tag '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'
:javascript :javascript
window.jQuery||document.write('<script src="/javascripts/jquery.min.js"><\/script>');(function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;e=o.createElement(i);r=o.getElementsByTagName(i)[0];e.src='//www.google-analytics.com/analytics.js';r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));ga('create','UA-42449204-1');ga('send','pageview'); window.jQuery||document.write('<script src="/javascripts/jquery.min.js"><\/script>');(function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;e=o.createElement(i);r=o.getElementsByTagName(i)[0];e.src='//www.google-analytics.com/analytics.js';r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));ga('create','UA-42449204-1');ga('send','pageview');!function(a,b,c,d){d&&a.addEventListener("DOMContentLoaded",function(){$.ajax({url:$("use").first().attr("xlink:href").replace(/^(.*)\#.*$/,"$1"),dataType:"text",success:function(a){$("body").append('<div class="hide">'+a+"</div>"),$("use").each(function(){$(this).attr("xlink:href",function(a,b){return b.replace(/^.*(#.*)$/,"$1")})})}})})}(document,navigator,{},/Trident\/[567]\b/.test(navigator.userAgent));
#{yield :scripts} - if content_for?(:footer_scripts)
!function(a,b,c,d){d&&a.addEventListener("DOMContentLoaded",function(){$.ajax({url:$("use").first().attr("xlink:href").replace(/^(.*)\#.*$/,"$1"),dataType:"text",success:function(a){$("body").append('<div class="hide">'+a+"</div>"),$("use").each(function(){$(this).attr("xlink:href",function(a,b){return b.replace(/^.*(#.*)$/,"$1")})})}})})}(document,navigator,{},/Trident\/[567]\b/.test(navigator.userAgent)); = yield :footer_scripts
$(function(){ - if content_for?(:scripts) || content_for?(:dom_ready)
#{yield :dom_ready} :javascript
}); #{content_for?(:scripts) ? "#{yield :scripts}" : ''}#{content_for?(:dom_ready) ? "$(function(){#{yield :dom_ready}});" : ''}
= yield :footer_scripts

2
app/views/layouts/fields/_actions.html.haml

@ -4,5 +4,5 @@
%a.facebook-sign-in.button{href: '/oauth/facebook'} %a.facebook-sign-in.button{href: '/oauth/facebook'}
= _ action.to_s = _ action.to_s
- else - else
%button{id: action.to_s, name: action.to_s, type: 'submit'} %button{id: action.to_s, name: action.to_s, type: 'submit', formnovalidate: ([:cancel, :previous].include? action.to_sym)}
= _ action.to_s = _ action.to_s

2
app/views/layouts/fields/_default.html.haml

@ -4,7 +4,7 @@
- if @options[:help] - if @options[:help]
%p.help=_(("form.#{@options[:_controller]}.#{namekey}.help"), :w, 20) %p.help=_(("form.#{@options[:_controller]}.#{namekey}.help"), :w, 20)
- @label = @label_template ? (render ('layouts/fields/label_' + @label_template)) : nil - @label = @label_template ? (render ('layouts/fields/label_' + @label_template)) : nil
= @label_position == :before && @label ? @label : '' = (@label_position == :before || @label_position == :inside) && @label ? @label : ''
- if @label_position != :inside - if @label_position != :inside
%div=@html %div=@html
= @label_position == :after && @label ? @label : '' = @label_position == :after && @label ? @label : ''

6
app/views/organizations/_mini_preview.html.haml

@ -0,0 +1,6 @@
= link_to organization do
%figure.org-mini-preview{:class => (organization.avatar.is_landscape? ? 'landscape' : 'portrait')}
= image_tag organization.avatar.preview.url
%figcaption
%h5= organization.name
%p= location(organization.locations[0])

1
app/views/user_mailer/conference_registration_email.text.haml

@ -0,0 +1 @@
= @data.to_json.to_s

2
config/initializers/i18n.rb

@ -37,7 +37,7 @@ module I18n
when 't', 'title' when 't', 'title'
return (Forgery::LoremIpsum.sentences 1, options).capitalize return (Forgery::LoremIpsum.sentences 1, options).capitalize
end end
return nil return method
end end
def self.note(key, behavior = nil, behavior_size = nil) def self.note(key, behavior = nil, behavior_size = nil)

2
config/routes.rb

@ -14,7 +14,7 @@ BikeBike::Application.routes.draw do
#resources :workshops, :param => 'slug' #resources :workshops, :param => 'slug'
#get :register, :param => 'step' #get :register, :param => 'step'
#post 'register/next' => 'conferences#register_submit' #post 'register/next' => 'conferences#register_submit'
# match 'register(/:step)' => 'conferences#register', via: [:get, :post] match 'register(/:step)' => 'conferences#register', via: [:get, :post]
#patch 'register/step/:step' => 'conferences#register_step' #patch 'register/step/:step' => 'conferences#register_step'
#resources :registrations, :path => 'registration' do #resources :registrations, :path => 'registration' do
# get :form, on: :collection # get :form, on: :collection

5
db/migrate/20140716001857_add_confirmation_token_to_conference_registrations.rb

@ -0,0 +1,5 @@
class AddConfirmationTokenToConferenceRegistrations < ActiveRecord::Migration
def change
add_column :conference_registrations, :confirmation_token, :string
end
end

5
db/migrate/20140716002152_add_data_to_conference_registrations.rb

@ -0,0 +1,5 @@
class AddDataToConferenceRegistrations < ActiveRecord::Migration
def change
add_column :conference_registrations, :data, :binary
end
end

4
db/schema.rb

@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20140714013645) do ActiveRecord::Schema.define(version: 20140716002152) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -64,6 +64,8 @@ ActiveRecord::Schema.define(version: 20140714013645) do
t.boolean "is_confirmed" t.boolean "is_confirmed"
t.boolean "is_participant" t.boolean "is_participant"
t.boolean "is_volunteer" t.boolean "is_volunteer"
t.string "confirmation_token"
t.binary "data"
end end
create_table "conference_types", force: true do |t| create_table "conference_types", force: true do |t|

BIN
public/registration_data/1t3i4wgk5899kx2x/Thumbs.db

Binary file not shown.
Loading…
Cancel
Save